Repository navigation
v1.2.2 — Security fixes (root command execution, MySQL account takeover) + Laravel 13
This is a security release fixing two critical vulnerabilities. Every install should upgrade, especially any that host more than one customer.
Security
Both issues could be exploited by any ordinary logged-in tenant. No admin access or shell access was needed.
- Root command execution through the website document root (GHSA-38vh-2qjr-xpmg). The document root entered when creating a website was passed unvalidated into a
sedprogram run as root, so crafted input could run arbitrary commands as root. The same field also allowed../traversal and injecting lines into the Apache config. The document root is now restricted to a plain relative path. The root helpers fill templates withoutsed, validate every argument, and refuse to create directories outside the tenant's owndomainsfolder. - Takeover of the panel's MySQL account through a database password (GHSA-68m9-96fg-rqm5). Database passwords were interpolated into
CREATE USER/ALTER USER, so a crafted password could also change the password of the privilegedlaranodeMySQL account. Passwords are now sent as properly escaped literals, and charset/collation must be a pair the MySQL server actually supports.
Both were reported by mattw-services, who handled them responsibly and supplied clear reproductions.
Changed
- Upgraded to Laravel 13, which requires PHP 8.3 or newer. Installs made with the installer already run PHP 8.4. On an older PHP, the upgrader stops before changing anything and tells you what to do.
Upgrading
curl -sSL https://raw.githubusercontent.com/crivion/laranode/refs/heads/main/laranode-scripts/bin/laranode-upgrade.sh | bashOnce it finishes, check that the commit the upgrader prints matches this release.
Websites and databases created before upgrading keep their stored values. If you host tenants you don't fully trust, check /etc/apache2/sites-available/*.conf for unexpected DocumentRoot paths or directives, and confirm the laranode MySQL account's password still matches DB_PASSWORD in .env.