This release includes 9 security fixes for security teams reviewing exposed deployments.
Topics
+11 more
Affected surfaces
ReleasePort's take
Moderate signalThe v0.10.28 release patches critical injection, SSRF, and guardrail flaws across multiple Google Ads surfaces.
Why it matters: Fixes GAQL injection (severity 95), removes CSV formula injection (90), eliminates landing‑page screenshot SSRF (88), moves Meta OAuth secrets to POST body (85), adds locked read‑modify‑write protection for credentials files (80) and bounds image decompression (65).
Summary
AI summaryFull-codebase security review fixes multiple injection, SSRF, and guardrail issues.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Critical |
Fixes GAQL injection in google_ads_ad_groups.update and missing ID validation on targeting updates. Fixes GAQL injection in google_ads_ad_groups.update and missing ID validation on targeting updates. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | Critical |
Removes CSV formula injection vulnerability in Google Ads BYOD export. Removes CSV formula injection vulnerability in Google Ads BYOD export. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | High |
Eliminates SSRF vulnerabilities in landing-page screenshot tool and lp_analyzer. Eliminates SSRF vulnerabilities in landing-page screenshot tool and lp_analyzer. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | High |
Moves Meta OAuth secrets from query string to POST body. Moves Meta OAuth secrets from query string to POST body. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | High |
Adds locked read‑modify‑write protection for credentials.json, STRATEGY.md, and Claude settings file. Adds locked read‑modify‑write protection for credentials.json, STRATEGY.md, and Claude settings file. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | High |
Closes credential‑guard symlink‑evasion gap. Closes credential‑guard symlink‑evasion gap. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | High |
Prevents BRAND_KIT logo path sandbox escape. Prevents BRAND_KIT logo path sandbox escape. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | Medium |
Adds image‑header dimension validation to bound decompression. Adds image‑header dimension validation to bound decompression. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Security | Medium |
Fixes zero‑budget path that bypassed increase‑pct guardrail. Fixes zero‑budget path that bypassed increase‑pct guardrail. Source: llm_adapter@2026-07-18 Confidence: high |
— |
| Feature | Low |
Plugins can ship native slash skills via `mureo.native_skills`. Plugins can ship native slash skills via `mureo.native_skills`. Source: granite4.1:30b@2026-07-18-audit Confidence: low |
— |
| Feature | Low |
`mureo_analytics_run` executes a plugin's `AnalyticsModule`. `mureo_analytics_run` executes a plugin's `AnalyticsModule`. Source: granite4.1:30b@2026-07-18-audit Confidence: low |
— |
| Feature | Low |
/onboard offers to seed the STRATEGY.md Guardrails section. /onboard offers to seed the STRATEGY.md Guardrails section. Source: granite4.1:30b@2026-07-18-audit Confidence: low |
— |
| Bugfix | Medium |
Gates GA4 credential wizard under multi‑account backend, returning HTTP 403 and removing UI elements. Gates GA4 credential wizard under multi‑account backend, returning HTTP 403 and removing UI elements. Source: llm_adapter@2026-07-18 Confidence: low |
— |
| Bugfix | Low |
Configure host + host_paths are captured as one atomic snapshot. Configure host + host_paths are captured as one atomic snapshot. Source: granite4.1:30b@2026-07-18-audit Confidence: low |
— |
| Refactor | Low |
Live-client analytics `account_id` is scoped through the allow‑list and canonicalized. Live-client analytics `account_id` is scoped through the allow‑list and canonicalized. Source: granite4.1:30b@2026-07-18-audit Confidence: low |
— |
Full changelog
Added
- Plugins can ship native slash skills via
mureo.native_skills(#439). A
new entry-point group lets a plugin deploy/<name>workflow skills into
~/.claude/skillsand~/.codex/skillsalongside mureo's own bundle, so
a platform-specific workflow the operator invokes directly can be
distributed by a plugin. Distinct frommureo.skills(runtime context
skills that are never copied to the host skill dirs). Deployment runs during
setup (claude-code/codex),mureo configure, andmureo upgrade, and
removal runs from clear-setup. Safety: built-in-first (a plugin can never
shadow a core/slash), first-wins between plugins, per-skill fault
isolation, and a recursive symlink-containment check so a plugin cannot
exfiltrate a file from outside its package throughcopytree. mureo_analytics_runexecutes a plugin'sAnalyticsModule(#440). A new
read-only MCP tool actually invokes a registered module'sdetect_anomalies
/diagnose_performance/audit_creative/analyze_budget_efficiencyand
returns the structured result. Previously a plugin could advertise a
capability viamureo_analytics_modules_listbut had no way to run it — the
analysis was dead code. Credential-lazy, read-only, and fault-isolated (a
broken or non-serializable module returns a structurederrorstatus instead
of crashing the workflow). Thedaily-check,rescue, and_mureo-shared
skills now run advertised capabilities through it. No new plugin ABI./onboardproactively offers to set the STRATEGY.md## Guardrails(#364).
The onboarding flow now offers to seed the guardrail section so budget and
blocked-operation limits are in place from the start.
Fixed
- GA4 credential wizard is gated under a multi-account backend (#442). GA4
auth is a single service account; under a multi-account backend that one SA
would reach every account/property. The configure server now refuses a write
whose effective section resolves toga4(HTTP 403), mirroring the Search
Console multi-account fail-closed (#375), and the Setup UI removes GA4
entirely (auth slot, selection checkbox, and provider-install instructions).
Standalone OSS is unaffected. - Configure host + host_paths are captured as one atomic snapshot (#407).
Closes a race where the detected host and its derived paths could be read
from two different points in time. - Live-client analytics
account_idis scoped through the #411 allow-list
(#413, #435). The analytics live clients now resolveaccount_idthrough
the tenant allow-list (fail-closed on a workspace-scope refusal), canonicalize
a Metaaccount_idto itsact_form on the unscoped path, and thread the
resolved id back to callers so cross-account exposure cannot slip through the
analytics seam.
Security
- Full-codebase security & correctness review fixes (#441). Fixes surfaced
by an adversarial review across the codebase: a GAQL injection reachable via
google_ads_ad_groups.update(unvalidatedad_group_id) and missing ID
validation on location/schedule-targeting updates; CSV formula injection in
the Google Ads BYOD export (a shared_csv_safesanitizer now covers every
adapter); SSRF via un-re-validated redirect hops in the landing-page
screenshot tool and duplicated/incomplete SSRF guards inlp_analyzer; a
blocked_operationsguardrail whose documented examples named non-existent
tools so it never fired; Meta OAuth secrets moved from the query string to the
POST body; locked read-modify-write oncredentials.json/STRATEGY.md/
the Claude settings file; a credential-guard symlink-evasion gap; a
BRAND_KIT logo path sandbox escape; image-header dimension validation to bound
decompression; a zero-budget path that bypassed the increase-pct guardrail;
and the coverage gate no longer excludesmureo/mcp/*. CI actions are now
pinned to commit SHAs.
Security Fixes
- GAQL injection in `google_ads_ad_groups.update` (unvalidated `ad_group_id`)
- Missing ID validation on location/schedule-targeting updates
- CSV formula injection in Google Ads BYOD export fixed with `_csv_safe` sanitizer
- SSRF via un-re-validated redirect hops in landing-page screenshot tool and duplicated guards in `lp_analyzer`
- Blocked‑operations guardrail examples corrected so it fires as intended
- Meta OAuth secrets moved from query string to POST body
- Credential-guard symlink-evasion gap closed
- BRAND_KIT logo path sandbox escape mitigated
- Image-header dimension validation added to bound decompression
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About logly/mureo
Framework for AI agents (Claude Code, Cursor, Codex, Gemini) to operate Google Ads, Meta Ads, and Search Console. Grounded in a local STRATEGY.md — not metric-chasing. Defense-in-depth security, local-first. Apache 2.0.
Related context
Related tools
Beta — feedback welcome: [email protected]