Documentation
¶
Overview ¶
Package aem_cloudsettings_injection detects the AEM cloud-settings pre-auth write chain (CVE-2025-54246) and the Expression Language injection it enables (CVE-2025-54247 / CVE-2025-54248). Both are confirmed strictly in-band: a probe value is written through the BulkImportConfigServlet and read back through the ConfDeliveryServlet, so no out-of-band infrastructure is needed. The writes are benign (a random marker property, and a 7*7 arithmetic probe) — no script execution beyond harmless EL arithmetic is ever performed.
Index ¶
Constants ¶
View Source
const ( ModuleID = "aem-cloudsettings-injection" ModuleName = "AEM Cloud Settings Pre-Auth Node Write / EL Injection" ModuleShort = "" /* 249-byte string literal not displayed */ )
Variables ¶
View Source
var ( ModuleDesc = `**What it means:** AEM's BulkImportConfigServlet writes request parameters into ` + "`/conf/global/settings/dam/import/cloudsettings`" + ` under a privileged account, and the ConfDeliveryServlet reads them back — also privileged. Together they give an unauthenticated arbitrary JCR-property write with a read-back channel (CVE-2025-54246). When the written ` + "`sling:resourceType`" + ` points at a JSP that evaluates a property as Expression Language, it becomes server-side EL injection (CVE-2025-54247/54248) that leaks OSGi secrets. **How it's exploited:** POST ` + "`importSource=UrlBased&sling:resourceType=<jsp>&action=x#{7*7}y`" + `, then read the node back through the ConfDeliveryServlet; ` + "`x49y`" + ` proves the EL evaluated. **Fix:** Apply the GRANITE-61551 hotfix and deny anonymous access to ` + "`/conf`" + ` and ` + "`/etc/cloudsettings`" + ` at the dispatcher.` ModuleConfirmation = "" /* 279-byte string literal not displayed */ ModuleSeverity = severity.Critical ModuleConfidence = severity.Firm ModuleTags = []string{"aem", "adobe", "injection", "el-injection", "rce", "acl", "cve", "cve2025", "cms", "moderate"} )
Functions ¶
This section is empty.
Types ¶
type Module ¶
type Module struct {
modkit.BaseActiveModule
// contains filtered or unexported fields
}
func (*Module) CanProcess ¶
func (m *Module) CanProcess(ctx *httpmsg.HttpRequestResponse) bool
func (*Module) IncludesBaseCanProcess ¶
func (*Module) ScanPerHost ¶
func (m *Module) ScanPerHost( ctx *httpmsg.HttpRequestResponse, httpClient *http.Requester, scanCtx *modkit.ScanContext, ) ([]*output.ResultEvent, error)
Click to show internal directories.
Click to hide internal directories.