All AEM as a Cloud Service skills: component development, Workflow model design, development, triggering, launchers, debugging, and triaging, Dispatcher config authoring, advisory, incident response, performance tuning, and security hardening, Rapid Development Environment (RDE) deployment, log inspection, snapshots, and troubleshooting via `aio aem rde`, Jackrabbit Oak query/index tuning (property, Lucene index definitions), and extracting/inventorying JCR queries (XPath, SQL2, QueryBuilder) across a codebase.
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Dispatcher Controls:
Audit Checks:
/crx/*, /system/*)/bin/querybuilder*)MCP Validation:
trace_request({"url":"/crx/de/index.jsp","method":"GET"}) # Should deny outside approved dev usage
trace_request({"url":"/content/site/en.html","method":"POST"}) # Should deny (read-only)
trace_request({"url":"/bin/querybuilder.json","method":"GET"}) # Should denySeverity if Failed: Critical
Dispatcher Controls:
Audit Checks:
MCP Validation:
# Check HTTPS config statically (vhost content)
validate({"config":"<vhost.conf content>","type":"httpd"})
lint({"mode":"directory","target":"/path/to/dispatcher/src","strict_mode":true})
# MCP does not directly return live response headers.
# Verify HSTS via config presence and, when available, external HTTP probe:
# curl -sI https://site.com/content/site/en.html | grep Strict-Transport-SecuritySeverity if Failed: High to Critical
Dispatcher Controls:
Audit Checks:
../* patterns)MCP Validation:
trace_request({"url":"/content/site/../../../etc/passwd","method":"GET"}) # Should deny/400
trace_request({"url":"/content/site/en.html?query=<script>","method":"GET"}) # Should sanitize
trace_request({"url":"/content/site/en.json;.css","method":"GET"}) # Should handle safelySeverity if Failed: High
Dispatcher Controls:
Audit Checks:
MCP Validation:
lint({"mode":"directory","target":"/path/to/dispatcher/src","strict_mode":true})
sdk({"action":"check-files","config_path":"/path/to/dispatcher/src"})
validate({"config":"<dispatcher.any content>","type":"cloud"})Severity if Failed: Medium
Dispatcher Controls:
Audit Checks:
MCP Validation:
lint({"mode":"directory","target":"/path/to/dispatcher/src","strict_mode":true})
validate({"config":"<httpd/vhost header config content>","type":"httpd"})
inspect_cache({"url":"/content/site/en.html","show_metadata":true})
# For live header proof, use external HTTP probe in environment:
# curl -sI https://site.com/content/site/en.htmlSeverity if Failed: Medium to High
Dispatcher Controls:
Audit Checks:
MCP Validation:
# Check dispatcher version
# Verify against: https://experienceleague.adobe.com/en/docs/experience-manager-dispatcher/using/getting-started/release-notesSeverity if Failed: High (if CVEs present)
Dispatcher Controls:
Audit Checks:
MCP Validation:
trace_request({"url":"/system/console","method":"GET"}) # Should deny before reaching AEM
tail_logs({"lines":1000})
# Review returned entries for sensitive tokens/password patterns.Severity if Failed: Critical (if bypass possible)
Dispatcher Controls:
Audit Checks:
MCP Validation:
sdk({"action":"diff-baseline","config_path":"/path/to/dispatcher/src"})
sdk({"action":"check-files","config_path":"/path/to/dispatcher/src"})Severity if Failed: Medium
Dispatcher Controls:
Audit Checks:
MCP Validation:
tail_logs({"lines":100})
monitor_metrics({"window_minutes":60,"breakdown_by":"status_code"})Severity if Failed: Low to Medium
Dispatcher Controls:
Audit Checks:
MCP Validation:
trace_request({"url":"/content/site/proxy?url=http://<loopback-target>","method":"GET"}) # Should deny
trace_request({"url":"/content/site/proxy?url=http://<metadata-service-address>","method":"GET"}) # Should denySeverity if Failed: High
| Requirement | Dispatcher Control | Check |
|---|---|---|
| 2.2 | Strong crypto (TLS 1.2+) | SSL config audit |
| 6.5.3 | No sensitive data in logs | Log content review |
| 6.6 | Web application firewall | Filter rules audit |
| 8.2.1 | Multi-factor auth | Pass-through to AEM |
| Control | Dispatcher Mapping | Check |
|---|---|---|
| 2.1 | Run as dedicated user | Process ownership |
| 3.1 | Disable directory listing | Options -Indexes |
| 4.1 | Remove unnecessary modules | LoadModule audit |
| 5.1 | Configure TLS 1.2+ minimum | SSLProtocol config |
| 7.1 | Set ServerTokens to Prod | ServerTokens audit |
| Function | Dispatcher Control | Implementation |
|---|---|---|
| Identify | Asset inventory | Config management |
| Protect | Access controls | Filter rules |
| Detect | Logging/monitoring | Access logs, metrics |
| Respond | Incident handling | Log analysis |
| Recover | Backup/restore | Config version control |
## OWASP A01:2021 - Broken Access Control
**Severity:** Critical
**Status:** Failed
**Finding:**
Admin console unexpectedly accessible via `/crx/de/index.jsp` outside intended environment-scoped usage.
**Evidence:**
```text
trace_request({"url":"/crx/de/index.jsp","method":"GET"})
status: passed/allowedImpact:
Recommendation: Add deny rule for admin paths with highest priority, or document the approved dev-only environment gate if that is the intended cloud behavior. Place the deny after any allow that matches the path (last-applied filter wins).
/filter {
/0000 { /glob "*" /type "deny" }
/0001 { /glob "/crx/*" /type "deny" }
/0002 { /glob "/system/*" /type "deny" }
# ... other allows ...
}Verification:
trace_request({"url":"/crx/de/index.jsp","method":"GET"})
# Expected: denied outside approved dev usage, otherwise explicitly documentedReferences:
---
## Automated OWASP Check Pattern
```text
Use your automation runner to execute MCP calls and score checks:
1) access = trace_request({"url":"/crx/de/index.jsp","method":"GET"})
2) traversal = trace_request({"url":"/content/../../../etc/passwd","method":"GET"})
3) static_check = lint({"mode":"directory","target":"/path/to/dispatcher/src","strict_mode":true})
4) integrity = sdk({"action":"check-files","config_path":"/path/to/dispatcher/src"})
5) drift = sdk({"action":"diff-baseline","config_path":"/path/to/dispatcher/src"})
Then score pass/fail using returned stage statuses and issue severities.
For live response-header checks (HSTS/CSP/etc), add external HTTP probes in the same pipeline..tessl-plugin
skills
aem-rde
aem-workflow
code-assessment
content-distribution
create-component
assets
references
dispatcher
incident-response
references
dispatcher-foundation
performance-tuning
references
dispatcher-foundation
security-hardening
references
dispatcher-foundation
technical-advisory
references
dispatcher-foundation
workflow-orchestrator
references
dispatcher-foundation
ensure-agents-md
references
migration
references
dispatcher
legacy-ui
template-modernization
validation
scripts
dispatcher-tool
validate-migration