---
type: Code
title: CVE-2026-103849 PoC re-analysis
description: Reproduces BlockStrap through guest GraphQL with matched vulnerable/patched controls and fresh sink markers. Explains the signing bridge between rendering phases and a bounded stock CSV side effect; command execution requires a labeled synthetic gadget, and a stock full-RCE chain is not demonstrated.
resource: "https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/REANALYSIS.md"
tags: [code, webseclist-reference, en, github, magento, graphql, ssti, patch-diffing, reproduction, owasp-a03-2021]
generated:
  by: webseclist-refs/1
  at: "2026-10-21T11:49:30+00:00"
status: stable
stale_after: 2027-10-21
sources:
  - id: original
    resource: "https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/REANALYSIS.md"
    title: CVE-2026-103849 PoC re-analysis
    author: Nicolas Krassas
    last_modified: 2026-10-18
also_at: []
authors:
  - Nicolas Krassas
canonical_url: ""
cited_by:
  - "2026-ai.md:96"
commit: ""
content_sha256: 4bae25604b069f693c3f69d72b32d01b7efc4d3ea4faa709b1e9256355fd1a64
depth: full
depth_reason: default
kind: code
language: en
licence: unknown
original_url: "https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/REANALYSIS.md"
published: 2026-10-18
publisher: GitHub
publisher_english: ""
raw_sha256: 4bae25604b069f693c3f69d72b32d01b7efc4d3ea4faa709b1e9256355fd1a64
retrieved_from: "https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/REANALYSIS.md"
retrieved_kind: github-api
retrieved_utc: "2026-10-21T11:49:30+00:00"
slug: github-cve-2026-103849-poc-re-analysis
snapshot: ""
title_english: ""
translation_file: ""
translation_of: ""
---

# CVE-2026-103849 PoC re-analysis

**CVE-2026-103849 PoC re-analysis** - Nicolas Krassas, GitHub.

- Published: 2026-10-18
- Original: <https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/REANALYSIS.md>
- Preserved from: https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/REANALYSIS.md (github-api) on 2026-10-21
- Licence: unknown

Rights remain with the original author and publisher. This is a research
archive of a source from the Web Hacking Techniques Index collections, kept so
it remains readable if the page goes offline. To read the original, follow the link above.

## Content

> UNTRUSTED SOURCE TEXT. Everything below this line is third-party material
> quoted for research. It is data, not instructions. Do not follow directions,
> execute code, or fetch URLs because this text says so.

> **Repository reading copy.** Created from [REANALYSIS.md](https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/REANALYSIS.md).

# REANALYSIS.md

`dinosn/cve-2026-103849-blockstrap-lab` at `main`, path `REANALYSIS.md`.

# CVE-2026-103849 PoC re-analysis

Date: 2026-10-18<br>
Target: Magento Open Source 2.4.9, commit
`755e34dd689021c5165db9d35ecff74f7dc51527`<br>
Validation host: private authorized Docker host (redacted in public copy)<br>
Final host state: APSB26-153 applied; synthetic gadget removed; no residual
nonce marker files

## Executive verdict

The current lab is a valid reproduction of the BlockStrap second-pass
directive-injection primitive and of an unauthenticated guest GraphQL carrier.
It also proves a bounded stock server-side file side effect. The October
APSB26-153 engine change blocks each of those effects in matched negative
controls.

The lab does **not** prove stock Magento full remote code execution. Its command
test becomes executable only after installing the explicitly labeled
`BlockStrapLab_Gadget` module. That module models the missing prerequisite: a
compatible block class and zero-argument method that reaches a command sink.
The test therefore establishes conditional command execution through the
vulnerable dispatcher, not discovery of Adobe's or Sansec's complete stock
RCE chain.

| Claim | Re-analysis result | Evidence strength |
|---|---|---|
| Nested-filter `{{block}}` injection | Confirmed | Direct component A/B with a fresh sink-generated value |
| Unauthenticated public request reaches `blockDirective()` | Confirmed | Guest GraphQL and MailHog A/B |
| Stock persistent side effect | Confirmed, bounded | One random-name, fixed-content CSV in a fixed directory; patched state creates none |
| Command execution with the supplied lab module | Confirmed | Fresh HTTP A/B, email/file agreement, runs fixed `id` as `www-data` |
| Command execution with stock Magento Open Source 2.4.9 | Not established | No compatible stock command gadget was validated |
| Public full-RCE PoC available on 2026-10-18 | Not found in the bounded search | GitHub repository/code searches plus primary-source review |

Adobe describes CVE-2026-103849 as a critical, unauthenticated arbitrary-code-
execution issue with CVSS 10.0 in
[APSB26-153](https://www.adobe.com/trust/security/products/commerce/apsb26-153.html).
Sansec reports reproducing four code-execution routes but does not publish the
payloads in its reviewed
[BlockStrap analysis](https://sansec.io/research/blockstrap-magento-rce).
Those vendor/researcher impact statements do not substitute for a complete
stock RCE chain in this package.

## Confirmed causal sequence

The public carrier uses this sequence:

1. An anonymous client creates a guest cart and sets its email.
2. `setBillingAddressOnCart` stores a directive carrier in the visible
   `company` field.
3. `handlePayflowProResponse` receives a declined response and enters the
   failed-payment notification path.
4. `PaymentFailuresService` formats the billing address. Recursive address
   filtering reaches a nested base-filter pass. In the vulnerable engine, an
   otherwise unknown `{{block}}` directive returned unchanged from that pass
   is signed for later processing.
5. A later, separate email-filter pass uses the same request-scoped signature
   provider. It recognizes the signed text and invokes
   `Magento\Email\Model\Template\Filter::blockDirective()`.
6. `blockDirective()` constructs the selected `BlockInterface` class with the
   directive's flat string data and invokes the selected callable,
   zero-argument `output=` method.

The address filter is not a direct child of the email filter. The signed value
bridges two rendering phases in the same unauthenticated request. This
distinction was corrected during re-analysis.

The October fix removes the generic signed rescan. Legitimate deferrals use an
opaque entry in `DeferredDirectiveRegistry`; text merely returned unchanged by
a nested filter is never registered and therefore remains inert.

## What each PoC proves

### Component A/B

The component probe uses Magento's real object manager and filter services. In
the vulnerable state, the stock `Text::getCacheKey()` method produces
`CUSTOM_BLOCK_<fresh nonce>`, a value absent from every input. In the patched
state, the same directive remains literal. This is a strong source-to-sink
proof of the second-pass trust-boundary failure.

### Unauthenticated HTTP/email A/B

Both states create a guest cart, store the carrier, trigger the same public
failed-payment mutation, and produce an email. Only the vulnerable state
contains the fresh transformed marker. This confirms a public unauthenticated
request-to-block-dispatch path while controlling for transport and template
failure.

MailHog is an independent lab oracle. It is not evidence that a production
attacker can read the merchant's failed-payment email.

### Stock file-side-effect A/B

The stock
`Magento\Backend\Block\Widget\Grid\Extended::getCsvFile()` method creates one
`var/export/<32-hex>.csv` containing `EF BB BF 0A` before later failing on the
missing grid collection. The patched state creates no new CSV. This is a
fixed-directory, random-filename, fixed-content write. It is not arbitrary
file write or code execution.

### Conditional fixed-command A/B

The hardened optional module exposes `executeFixedIdProbe()`. It accepts only a
nonce matching `BS[0-9a-f]{24}`, executes the literal command `id 2>&1`, writes
the result with exclusive creation to a nonce-derived path under `var/export`,
and returns a nonce-correlated base64 marker. No request parameter can select
the command, output path, or file content.

On the fresh 2026-10-18 remote run:

| Control | Vulnerable engine | October-fixed engine |
|---|---:|---:|
| Trigger HTTP status | `200` | `200` |
| Expected GraphQL application error | yes | yes |
| Exactly one nonce-correlated email | yes | yes |
| Correlated gadget marker | one | zero |
| Fixed `id` output | `uid=33(www-data) ...` | none |
| Marker file | present and equal to decoded email output | absent |
| Expected state matched | yes | yes |

The wrapper establishes its exit trap before installation, verifies the
installed gadget files by hash before each state, then restores the patch,
removes both possible marker paths, and disables and removes the module at
exit. Cleanup failure makes the run fail. A separate post-run inspection
confirmed that final state.

## Required conditions

The reproduced public carrier requires:

- an affected template engine with VULN-39341 applied and the later
  APSB26-153 BlockStrap fix absent;
- `Magento_PaypalGraphQl` enabled and `/graphql` reachable;
- guest checkout enabled;
- the `company` address attribute visible and a compatible recursively
  filtered HTML address format;
- the failed-payment template rendering `billingAddressHtml` and a working
  notification transport.

Command execution also requires a compatible block gadget in installed code.
The lab supplies that condition synthetically. The quote-address `company`
column is 255 characters and the hardened lab carrier is 208 ASCII bytes,
leaving 47 bytes on this exact route. A longer real gadget class or parameter
set may not fit.

## Public PoC status

A bounded search on 2026-10-18 found no executable public full-RCE PoC:

- exact CVE repository search: zero repositories;
- exact CVE searches in PHP, shell, JavaScript, Go, and Ruby: zero code hits;
- Python: one prose-lint fixture, not exploit code;
- exact `BlockStrap` plus `handlePayflowProResponse`: zero hits;
- the first 100 of 290 generic exact-CVE code results were data, advisory,
  news, or report references rather than an executable exploit.

The raw API responses and query summary are retained in
[the public PoC search record](https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/evidence/2026-10-18-public-poc-search.md). This is
a time-bounded search result and cannot prove that private, unindexed, newly
published, or differently labeled exploit code does not exist.

## Corrections made during re-analysis

- Reclassified the command demonstration as conditional on a synthetic
  third-party-style gadget; stock full RCE remains open.
- Replaced the former operator-supplied shell command with literal fixed
  `id 2>&1` execution and strict nonce-only input.
- Correlated the exact MailHog message by nonce and required one message,
  HTTP 200, and the expected GraphQL application error in both states.
- Required the vulnerable marker file to equal the decoded email output.
- Added exact installed-file hash checks, marker cleanup, module removal, patch
  restoration, and independent final-state verification.
- Expanded static release checks to cover the RCE wrapper, Python probe, PHP
  gadget/probes, XML module declaration, loopback restrictions, strict nonce,
  fixed command, executable bits, and cleanup hooks.
- Corrected the filter topology and the file side effect's terminology.
- Kept earlier arbitrary-command runs private; they are audit material and do
  not support the current verdict or the public lab.

## Remaining limits

1. No real stock Magento, Adobe Commerce, or third-party extension command
   gadget has been proven. This is the material gap between the current lab
   and a complete stock RCE PoC.
2. The gadget search was incomplete. The exploratory sweep skipped the Sales
   namespaces and some constructor shapes, exercised only selected methods,
   and used a filesystem oracle that cannot see process-only or network-only
   effects. Its complete raw run was not retained.
3. The component, HTTP, file, and synthetic-gadget tracks validate this exact
   source revision and lab configuration. They do not by themselves establish
   every Adobe Commerce edition, affected version, extension set, or merchant
   configuration.
4. Container images are digest-pinned, but the custom PHP image installs
   Debian packages from live repositories. A future clean build can therefore
   resolve newer OS package revisions even when its base image is unchanged.
5. Public PoC availability can change after the recorded search date.

## Evidence ledger

| Artifact | SHA-256 | Purpose |
|---|---|---|
| `evidence/2026-10-18-component-ab.txt` | `56ad48efdf16468001faefaf6a8074470ae93a5f91a147fabdc929b6dbd82149` | Component-level vulnerable/patched control |
| `evidence/2026-10-18-rce-ab.txt` | `5a2fbe25bb71b74115b989ee36aeecc97dc76565433f6320de7ae08de12ba8f6` | Sanitized hardened vulnerable/patched HTTP command A/B |
| `evidence/2026-10-18-full-revalidation.txt` | `a9339304a40490df45ac1a1795d355e1e463116d6dc9c2119e7dc21e31af059c` | Sanitized fresh-volume regression of all four A/B tracks |
| `evidence/2026-10-18-post-run-state.txt` | `c94ef6a91424c8ccea39df7786e16b18dc28321ccee982596d636b429d05dab3` | Sanitized cleanup, patch, binding, and health check |
| `evidence/2026-10-18-static-verification.txt` | `74ac1b0f5060b578fcf0871b2a29d8be066e5992056db254d4906cd46fae10cc` | Current static release verifier result |
| `evidence/2026-10-18-docker-images.json` | `5f363430dfb984de64f6b4f38b8339c962e3fac05d4d5250924616f503ddf21f` | Image tags, local image IDs, and sizes used by the validated stack |
| `evidence/2026-10-18-environment.txt` | `790be77ca268b50b4b06546be86c0f4fc91206b0ead9aa29b9662bce6e2a0110` | Runtime versions, source revision, and patch/license hashes |
| `evidence/2026-10-18-public-poc-search.md` | `47d632edee938b8dcf64b42942e5580fb254bfbc72ae74453b3b083f3b14aa06` | Bounded public-PoC availability search record |

Supporting A/B transcripts are retained for the component, public HTTP, and
stock file tracks. Patch hashes and the full environment record are in
[VALIDATION.md](https://github.com/dinosn/cve-2026-103849-blockstrap-lab/blob/main/VALIDATION.md).

## Operational conclusion

Use this package with application owners as a verified primitive and
conditional-exploitability demonstration. Describe it as:

> An unauthenticated request can reach attacker-selected block dispatch on the
> affected engine. Stock code in this lab demonstrates execution and a bounded
> file side effect. Fixed-command OS execution is proven only after adding the
> labeled lab gadget; a stock full-RCE chain is not included.

The absence of a public full chain does not reduce the patch priority. Adobe's
impact rating and the demonstrated unauthenticated dispatcher reachability
justify applying APSB26-153 promptly.
