Security Advisory in Backpack\CRUD - Unauthenticated Command Injection

On May 16th 2026 we received a responsible disclosure report from security researcher Vishal Shukla (@therawdev) identifying an obscure...

Cristian Tabacitu
Cristian Tabacitu
Share:

On May 16th 2026 we received a responsible disclosure report from security researcher Vishal Shukla (@therawdev) identifying an obscure remote code execution vulnerability in Backpack CRUD's telemetry code. We verified it and within 24 hours we released patches for v7, v6 and v5, then notified customers directly. We have given Backpack users a 30-day window to do composer update backpack/crud before publishing the advisory.

The attack required no authentication. The affected versions are:

  • CRUD v7 before v7.0.36
  • CRUD v6 before v6.8.13
  • CRUD v5 version before v5.6.2

Who was actually at risk?

The vulnerability existed in the code, but it's now patched - if you've run composer update in the past 30 days, you already have the fix.

Practical exploitation required a rare combination of conditions that most standard Laravel deployments don't have (Apache or old nginx + exec() enabled in the web PHP process + correct environment). We tested across multiple servers and couldn't trigger it on any of them. However, the vulnerability does exist under the right conditions, so it should be taken seriously.

Two conditions had to be true simultaneously:

1. PHP's exec() function was enabled. This is the default on VPS servers and Laravel Forge-managed servers. It is typically disabled on shared hosting, AWS Lambda (Vapor), and many managed platforms. Additionally, the function is sometimes enabled for CLI, but disabled for web processes.

2. The HTTP Host header reached PHP unmodified. Cloudflare and most CDNs normalize Host headers and would have blocked the malicious value before it reached your application. So do most WAF rules - they reject the request before PHP runs. However, a bare VPS without Cloudflare in front and without any WAF could be exposed - depending on the nginx / Apache version and configuration.

Conclusion: If you run on Forge or a VPS without Cloudflare (or similar), you should treat this as serious. Update and maybe even follow the check guide below.


What's the fix?

Please run composer update backpack/crud immediately - that's it. The fix is in:

  • v7.0.36 (Laravel 11/12)
  • v6.8.13 (Laravel 10/11/12)
  • v5.6.2 (Laravel 8/9/10)

Was my server compromised?

We have no reason to believe this vulnerability has been known or exploited - but we can't rule it out. To understand if your server was compromised, you can SSH into your production server and run the following commands:

Step 1 — Were you vulnerable?

Check if

php -i | grep disable_functions
php -m | grep curl

If exec appears in disable_functions, or curl is not listed — it's possible you were not vulnerable. But. The above only tests your CLI php binary. If your web server runs PHP via FPM, it has a separate php.ini and may have exec enabled/disabled independently:

grep -rn "disable_functions" /etc/php/*/fpm/php.ini 2>/dev/null
grep -rn "disable_functions" /etc/php/*/fpm/pool.d/*.conf 2>/dev/null

If exec appears in either → your web process had exec() disabled even if CLI did not. You were not vulnerable.

Even if exec() were enabled, check whether your web server or a WAF rejected the request before PHP ran. nginx has increasingly strict request-line and Host-header validation, including rejection of spaces and control characters in the Host line in 1.21.1, and later RFC 3986-aligned host validation in 1.29.4; however, you should not assume it strips every potentially dangerous character such as a single quote. On Apache, behavior depends heavily on version and configuration, including whether ModSecurity or another WAF was enabled.

Step 2 — Check for probing attempts in nginx logs

grep "'" /var/log/nginx/access.log
zgrep "'" /var/log/nginx/access.log.*.gz

No results = no probing attempts in your logs.

Additionally:

# nginx — single quotes in Host header; 400 = blocked before PHP, 200/302 = reached PHP
grep "'" /var/log/nginx/access.log | awk '{print $9}' | sort | uniq -c
zgrep "'" /var/log/nginx/access.log.*.gz | awk '{print $9}' | sort | uniq -c

# Apache
grep "'" /var/log/apache2/access.log | awk '{print $9}' | sort | uniq -c

How to interpret:

  • All results showing 400 → probing attempts were blocked by nginx before reaching PHP. No further action needed.
  • Results showing 200 or 302 alongside ' in the Host → requests reached your application. Continue to Steps 3–6.

Step 3 — Look for suspicious files

ls -lat /tmp | head -40
find /var/www -name "*.php" -newer /var/www/html/index.php -not -path "*/storage/*" 2>/dev/null

Step 4 — Check for unexpected cron jobs

crontab -u www-data -l 2>/dev/null
crontab -u forge -l 2>/dev/null

Step 5 — Check for unexpected outbound connections

ss -tnp | grep -v "127.0.0.1"
sudo last | head -30

Step 6 — The hard truth about .env

If an attacker ran a command on your server, reading your .env file is the most likely first action. Linux does not log file reads by default, so there is no reliable way to detect this after the fact. If you were vulnerable (Step 1) and found evidence of probing (Step 2), treat your .env secrets as compromised and rotate them:

  • APP_KEY
  • Database password
  • Mail/SMTP credentials
  • S3 / storage keys
  • Stripe and any other third-party API keys

Timeline

Date Event
May 16, 2026 Vulnerability reported by @therawdev
May 17, 2026 Verified and patched
May 19, 2026 Customers notified by email
June 15, 2026 Public advisory published
June 17, 2026 Public blog post published

Credit

Full credit to Vishal Shukla (@therawdev) for identifying this vulnerability and reporting it responsibly rather than exploiting it. This is exactly how coordinated disclosure should work, and it made a real difference for our customers. The internet is a better place, with people like him on the good guys' team - thank you.


Questions?

Reply to the email we sent you. We're here.

— Tabacitu & the Backpack team

Want to receive more articles like this?

Subscribe to our "Article Digest". We'll send you a list of the new articles, every week, month or quarter - your choice.

Reactions & Comments

What do you think about this?

Latest Articles

Wondering what our community has been up to?