Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
drupal-move-block-markup — Drupal 11.4.8 - High - Remote - XSS - Move Block sibling labels skip @label escaping | Kitploit
Tools/GitHubGitHub/abraxas/drupal-move-block-markup
Static Code Analysis (SAST)Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration Testing
GitHubabraxas/drupal-move-block-markup

drupal-move-block-markup

Drupal 11.4.8 - High - Remote - XSS - Move Block sibling labels skip @label escaping

View Repository
3 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

Abraxas Labs - drupal-move-block-markup

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  drupal-move-block-markup

drupal-move-block-markup

Class: Stored XSS Reach: Remote

Drupal core 11.4.8 (61044508) - Drupal

SA-CORE-2026-012 switched the current Move Block row to t('@label (current)'), which Html::escape()s. Sibling rows in the same region still assign BlockPluginTrait::label() straight to #markup in MoveBlockForm. That label is configuration['label'], a raw textfield. Renderer::ensureMarkupIsSafe then XSS-filters a string with the admin tag list, so a <b> (and other admin tags) survives.

A Layout Builder editor who can set a block title to HTML reaches another editor or admin who opens Move on a different block in that region. Stored XSS in the Move dialog. Not RCE and not LPE.

IDno CVE yet
ClassStored XSS
ReachRemote (Layout Builder block configure; victim opens Move Block)
CWECWE-79
CVSSMedium: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
ProductDrupal core
Affected11.4.8 (61044508071749629aaf3380aa85971e94df9e84)
AuthLayout Builder block configure. Victim opens Move Block.
LicenseGNU Affero GPL v3.0
Lab127.0.0.1 only

What an attacker can do

Writer: user who can place or configure Layout Builder blocks (not site-config). Victim: another LB editor or admin who opens Move on a different block in the same region.

PrivilegeMethod / sinkKindLab-proven or inferred
Print attacker HTML in the Move dialog sibling row$label['#markup'] = $plugin->label(); then ensureMarkupIsSafeIntegrity of HTMLLab-proven. Sibling HTML is <b class="lb-sib">DRUPAL-MOVE-BLOCK-MARKUP-WITNESS</b>
Keep admin-tag markup (<b>, and the rest of Xss::getAdminTagList)string #markup is XSS-filtered with the admin list, not escapedIntegrity of HTMLLab-proven for <b>
Session / actions as the victim editor in the Layout Builder originStored XSS in that dialogIntegrity of victim sessionInferred. Lab stops at raw HTML in the sibling cell
Negative: current rowt('@label (current)', ...)ClosedLab-proven. &lt;em class="lb-cur"&gt;...
Negative: sibling through @labelpatched gadget pathClosedLab-proven. &lt;b class="lb-sib"&gt;...

Closed on this leftover: live Drupal site install (this lab is a gadget); Layout Builder UI session theft as a measured HTTP oracle; RCE; LPE. Unauthenticated visitors cannot open Move Block.

Same pin leftover: AttributeXss HTMX attrs.

How I found it

I pinned Drupal 11.4.8 after SA-CORE-2026-012. The advisory closed the current block title. MoveBlockForm.php 210-218:

if ($is_current_block) {
  $label['#markup'] = $this->t('@label (current)', ['@label' => $plugin->label()]);
  // ...
}
else {
  $label['#markup'] = $plugin->label();
}

BlockPluginTrait::label() returns configuration['label'] when set. Renderer::ensureMarkupIsSafe does not XSS-filter MarkupInterface (@label already escaped). A raw string is filtered with the admin tag list.

Wrong turns already recorded: treating the current row as still raw (it is not); claiming this is RCE; a live Drupal site as the only oracle (the leftover is these functions); a reverse shell. Theatre.

Lab

python3 drupal-move-block-markup-Abraxas-Labs.py

or

cd lab
./run.sh

Target only http://127.0.0.1:19490. Faithful gadget of the 11.4.8 functions (copy of MoveBlockForm leftover, FormattableMarkup, ensureMarkupIsSafe, Xss::filter). Not a live drupal:11.4.8 site. Last line uses how=gadget.

SUCCESS drupal-move-block-markup how=gadget sibling-raw-tag=yes current-escaped=yes patched-sibling-escaped=yes DRUPAL-MOVE-BLOCK-MARKUP-WITNESS

The fix

Use @label (or Html::escape) for every row, not only the current block.

References

  • github.com/drupal/drupal tag 11.4.8 (61044508071749629aaf3380aa85971e94df9e84)
  • MoveBlockForm.php · BlockPluginTrait.php
  • Nearby patched: SA-CORE-2026-012
  • Same pin: drupal-htmx-attr
  • CWE-79

License

GNU Affero GPL v3.0. See LICENSE. Loopback lab only. No warranty.

Download Tool