CVE-2026-54175
backpack/crud: Unverified password change in MyAccountController via mass assignment
backpack/crud provides Create, Read, Update & Delete (CRUD) functions for Backpack, a collection of Laravel packages that help users build custom administration panels. Prior to 6.8.11 and 7.0.34, MyAccountController::postAccountInfoForm in src/app/Http/Controllers/MyAccountController.php at POST /admin/edit-account-info passes request data from $request->except(['_token']) to the user model instead of restricting updates to fields accepted by AccountInfoRequest::validationData(). An attacker with an authenticated Backpack session can therefore mass-assign password, the authentication column, or other deployment-specific fillable attributes. With the default Laravel 11 user model, a submitted plaintext password is automatically hashed and persisted, converting temporary session access into persistent account takeover without the old_password check enforced by the separate password-change route. Changing the authentication email can also enable later password-reset takeover, while additional fillable security attributes can permit deployment-specific privilege escalation or security-control changes. This issue is fixed in versions 6.8.11 and 7.0.34.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- High
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
7.6
backpack/crud: Unverified password change in MyAccountController via mass assignment
backpack/crud provides Create, Read, Update & Delete (CRUD) functions for Backpack, a collection of Laravel packages that help users build custom administration panels. Prior to 6.8.11 and 7.0.34, MyAccountController::postAccountInfoForm in src/app/Http/Controllers/MyAccountController.php at POST /admin/edit-account-info passes request data from $request->except(['_token']) to the user model instead of restricting updates to fields accepted by AccountInfoRequest::validationData(). An attacker with an authenticated Backpack session can therefore mass-assign password, the authentication column, or other deployment-specific fillable attributes. With the default Laravel 11 user model, a submitted plaintext password is automatically hashed and persisted, converting temporary session access into persistent account takeover without the old_password check enforced by the separate password-change route. Changing the authentication email can also enable later password-reset takeover, while additional fillable security attributes can permit deployment-specific privilege escalation or security-control changes. This issue is fixed in versions 6.8.11 and 7.0.34.
- Record
CVE-2026-54175- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-620
- Updated
- 2026-11-02
EUVDEUVD-2026-77706
7.6
backpack/crud provides Create, Read, Update & Delete (CRUD) functions for Backpack, a collection of Laravel packages that help users build custom administration panels. Prior to 6.8.11 and 7.0.34, MyAccountController::postAccountInfoForm in src/app/Http/Controllers/MyAccountController.php at POST /admin/edit-account-info passes request data from $request->except(['_token']) to the user model instead of restricting updates to fields accepted by AccountInfoRequest::validationData(). An attacker with an authenticated Backpack session can therefore mass-assign password, the authentication column, or other deployment-specific fillable attributes. With the default Laravel 11 user model, a submitted plaintext password is automatically hashed and persisted, converting temporary session access into persistent account takeover without the old_password check enforced by the separate password-change route. Changing the authentication email can also enable later password-reset takeover, while additional fillable security attributes can permit deployment-specific privilege escalation or security-control changes. This issue is fixed in versions 6.8.11 and 7.0.34.
- Record
EUVD-2026-77706- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-xpv2-hrfc-hw62
7.6
Laravel Backpack CRUD: Unverified password change in MyAccountController via mass assignment
Summary
The MyAccountController::postAccountInfoForm action bound to POST /admin/edit-account-info calls $this->guard()->user()->update($request->except(['_token'])). Because the controller uses except(['_token']) rather than $request->validated() or the restricted keys defined in AccountInfoRequest::validationData(), any column present in the user model's $fillable array is mass-assigned from the request, including password. Backpack ships a separate POST /admin/change-password route (postChangePasswordForm) that requires old_password verification via ChangePasswordRequest::withValidator. The edit-account-info endpoint silently bypasses that security control.
For the default Laravel 11 App\Models\User model — which Backpack's installer and documentation use as the canonical admin user model — $fillable is ['name','email','password']. The password cast is hashed, so a plaintext password=… form field is automatically hashed and persisted. Any attacker holding an authenticated Backpack session (session theft, stolen cookies, XSS, public-terminal residual session) can permanently take over the account by issuing one POST that includes password=<attacker_value>, with no knowledge of the victim's current password. This converts time-limited, session-bound access into persistent account takeover.
Vulnerable code
src/app/Http/Controllers/MyAccountController.php:38
public function postAccountInfoForm(AccountInfoRequest $request)
{
$result = $this->guard()->user()->update($request->except(['_token']));
...
}
src/app/Http/Requests/AccountInfoRequest.php validationData() only narrows what gets validated (name, email column) — it does NOT narrow what is later saved.
Impact
- Persistent account takeover after session theft. An adversary holding any authenticated Backpack session cookie (XSS, malware, stolen device, shared workstation) can rewrite the victim's password and retain access indefinitely, even after the original session expires or the victim logs out. Without this bypass the equivalent action requires
old_password, which the adversary does not have. - Email pivot for full takeover. The same handler permits unverified change of the authentication column (
emailby default). A hijacked session can change the email to one the attacker controls and then use Backpack's password-reset flow as a backup channel. - Mass-assignment of any other
$fillableattribute. In real deployments where the admin user model carries fields such asrole_id,is_admin,team_id,email_verified_at,two_factor_secret, etc., the same request mass-assigns those fields. This expands the impact to privilege escalation and 2FA disablement on apps that follow standard Laravel patterns of adding such columns to$fillable.
Fix recommendation
Replace $request->except(['_token']) with an explicit allowlist that mirrors AccountInfoRequest::validationData():
public function postAccountInfoForm(AccountInfoRequest $request)
{
$data = $request->only([backpack_authentication_column(), 'name']);
$result = $this->guard()->user()->update($data);
...
}
This preserves change-password as the sole path for password mutation (which already enforces old_password).
Coordinates
- Repository: https://github.com/Laravel-Backpack/CRUD
- Vulnerable file & line:
src/app/Http/Controllers/MyAccountController.php:38(release 6.8.10; mastere7201c5) - Route:
POST /admin/edit-account-info(default admin prefix;setup_my_account_routes=true) - Verified against:
backpack/crud 6.8.10,laravel/framework 11.x, PHP 8.4.7
— therawdev (responsible disclosure)
Reported by AI Agent sechub.dev and Vishal Shukla (@shukla304)
- Record
GHSA-xpv2-hrfc-hw62- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-620
- Updated
- 2026-11-02
NVD
7.6
backpack/crud provides Create, Read, Update & Delete (CRUD) functions for Backpack, a collection of Laravel packages that help users build custom administration panels. Prior to 6.8.11 and 7.0.34, MyAccountController::postAccountInfoForm in src/app/Http/Controllers/MyAccountController.php at POST /admin/edit-account-info passes request data from $request->except(['_token']) to the user model instead of restricting updates to fields accepted by AccountInfoRequest::validationData(). An attacker with an authenticated Backpack session can therefore mass-assign password, the authentication column, or other deployment-specific fillable attributes. With the default Laravel 11 user model, a submitted plaintext password is automatically hashed and persisted, converting temporary session access into persistent account takeover without the old_password check enforced by the separate password-change route. Changing the authentication email can also enable later password-reset takeover, while additional fillable security attributes can permit deployment-specific privilege escalation or security-control changes. This issue is fixed in versions 6.8.11 and 7.0.34.
- Record
CVE-2026-54175- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-620
- Updated
- 2026-11-02
OSV
7.6
backpack/crud: Unverified password change in MyAccountController via mass assignment
backpack/crud provides Create, Read, Update & Delete (CRUD) functions for Backpack, a collection of Laravel packages that help users build custom administration panels. Prior to 6.8.11 and 7.0.34, MyAccountController::postAccountInfoForm in src/app/Http/Controllers/MyAccountController.php at POST /admin/edit-account-info passes request data from $request->except(['_token']) to the user model instead of restricting updates to fields accepted by AccountInfoRequest::validationData(). An attacker with an authenticated Backpack session can therefore mass-assign password, the authentication column, or other deployment-specific fillable attributes. With the default Laravel 11 user model, a submitted plaintext password is automatically hashed and persisted, converting temporary session access into persistent account takeover without the old_password check enforced by the separate password-change route. Changing the authentication email can also enable later password-reset takeover, while additional fillable security attributes can permit deployment-specific privilege escalation or security-control changes. This issue is fixed in versions 6.8.11 and 7.0.34.
- Record
CVE-2026-54175- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-620
- Updated
- 2026-11-02
OSVGHSA-xpv2-hrfc-hw62
7.6
Laravel Backpack CRUD: Unverified password change in MyAccountController via mass assignment
Summary
The MyAccountController::postAccountInfoForm action bound to POST /admin/edit-account-info calls $this->guard()->user()->update($request->except(['_token'])). Because the controller uses except(['_token']) rather than $request->validated() or the restricted keys defined in AccountInfoRequest::validationData(), any column present in the user model's $fillable array is mass-assigned from the request, including password. Backpack ships a separate POST /admin/change-password route (postChangePasswordForm) that requires old_password verification via ChangePasswordRequest::withValidator. The edit-account-info endpoint silently bypasses that security control.
For the default Laravel 11 App\Models\User model — which Backpack's installer and documentation use as the canonical admin user model — $fillable is ['name','email','password']. The password cast is hashed, so a plaintext password=… form field is automatically hashed and persisted. Any attacker holding an authenticated Backpack session (session theft, stolen cookies, XSS, public-terminal residual session) can permanently take over the account by issuing one POST that includes password=<attacker_value>, with no knowledge of the victim's current password. This converts time-limited, session-bound access into persistent account takeover.
Vulnerable code
src/app/Http/Controllers/MyAccountController.php:38
public function postAccountInfoForm(AccountInfoRequest $request)
{
$result = $this->guard()->user()->update($request->except(['_token']));
...
}
src/app/Http/Requests/AccountInfoRequest.php validationData() only narrows what gets validated (name, email column) — it does NOT narrow what is later saved.
Impact
- Persistent account takeover after session theft. An adversary holding any authenticated Backpack session cookie (XSS, malware, stolen device, shared workstation) can rewrite the victim's password and retain access indefinitely, even after the original session expires or the victim logs out. Without this bypass the equivalent action requires
old_password, which the adversary does not have. - Email pivot for full takeover. The same handler permits unverified change of the authentication column (
emailby default). A hijacked session can change the email to one the attacker controls and then use Backpack's password-reset flow as a backup channel. - Mass-assignment of any other
$fillableattribute. In real deployments where the admin user model carries fields such asrole_id,is_admin,team_id,email_verified_at,two_factor_secret, etc., the same request mass-assigns those fields. This expands the impact to privilege escalation and 2FA disablement on apps that follow standard Laravel patterns of adding such columns to$fillable.
Fix recommendation
Replace $request->except(['_token']) with an explicit allowlist that mirrors AccountInfoRequest::validationData():
public function postAccountInfoForm(AccountInfoRequest $request)
{
$data = $request->only([backpack_authentication_column(), 'name']);
$result = $this->guard()->user()->update($data);
...
}
This preserves change-password as the sole path for password mutation (which already enforces old_password).
Coordinates
- Repository: https://github.com/Laravel-Backpack/CRUD
- Vulnerable file & line:
src/app/Http/Controllers/MyAccountController.php:38(release 6.8.10; mastere7201c5) - Route:
POST /admin/edit-account-info(default admin prefix;setup_my_account_routes=true) - Verified against:
backpack/crud 6.8.10,laravel/framework 11.x, PHP 8.4.7
— therawdev (responsible disclosure)
Reported by AI Agent sechub.dev and Vishal Shukla (@shukla304)
- Record
GHSA-xpv2-hrfc-hw62- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-620
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
backpack/crudPackagist |
before 6.8.11 | 6.8.11 |
backpack/crudPackagist |
7.0.0-alpha.1 up to 7.0.34 | 7.0.34 |
backpack/crudPackagist |
before 6.8.11, plus listed versions 0.4.10.5.00.5.10.5.100.5.9 Show 45 moreShow less0.6.00.6.10.6.20.6.30.6.40.6.50.70.7.10.7.20.7.30.7.40.7.50.7.60.7.70.7.80.7.90.8.00.8.10.8.100.8.110.8.120.8.130.8.140.8.150.8.160.8.170.8.180.8.20.8.30.8.40.8.50.8.60.8.70.8.80.8.90.9.00.9.10.9.100.9.20.9.30.9.40.9.50.9.60.9.70.9.8 |
6.8.11 |
backpack/crudPackagist |
7.0.0-alpha.1 up to 7.0.34, plus listed versions 7.0.07.0.0-alpha.27.0.0-alpha.37.0.0-alpha.47.0.0-alpha.5 Show 45 moreShow less7.0.0-alpha.67.0.0-alpha.77.0.0-alpha.87.0.0-alpha.97.0.0-beta.17.0.0-beta.107.0.0-beta.117.0.0-beta.127.0.0-beta.137.0.0-beta.147.0.0-beta.157.0.0-beta.167.0.0-beta.177.0.0-beta.187.0.0-beta.27.0.0-beta.37.0.0-beta.47.0.0-beta.57.0.0-beta.67.0.0-beta.77.0.0-beta.87.0.0-beta.97.0.17.0.107.0.117.0.127.0.137.0.147.0.157.0.167.0.177.0.187.0.197.0.27.0.207.0.217.0.227.0.237.0.247.0.257.0.267.0.277.0.287.0.297.0.3 |
7.0.34 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-54175 is a high vulnerability (CVSS 7.6) in Laravel-backpack Crud, published August 20, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.55%, the 46th percentile. Fixed in backpack/crud 6.8.11.
References
github.com/Laravel-Backpack/CRUD/security/advisories/GHSA-xpv2-hrfc-hw62
github.com/Laravel-Backpack/CRUD/pull/5980
github.com/Laravel-Backpack/CRUD/pull/5981
github.com/Laravel-Backpack/CRUD/commit/0d7a2820a0a356fde94c13a2db78bbe44393f0e7
github.com/Laravel-Backpack/CRUD/commit/ffe9a43ed006d0667e52997036c05ac0bc06cf91
github.com/Laravel-Backpack/CRUD/releases/tag/6.8.11
Left out here: 573 versions. The JSON record has them.