
Bitwarden Server v2026.9.2 - उच्च - IDOR - कॉलर उन संग्रहों में डिक्रिप्ट करने योग्य वॉल्ट आइटम डाल सकता है जिनमें वह लिख नहीं सकता
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · bitwarden-cipher-create-acl
Bitwarden Server v2026.9.2 - Bitwarden
Entity Framework पथ (MariaDB, Postgres, SQLite) पर Org cipher create, collection attach से पहले caller id को गिरा देता है। एक confirmed member उस collection में org-key item रख सकता है जिसमें वे लिख नहीं सकते। Collection members इसे सामान्य shared login के रूप में sync करते हैं।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-863 / CWE-639 |
| CVSS | High: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L |
| Product | Bitwarden Server |
| Affected | v2026.9.2 (9ee4e0eb) lite EF (MariaDB / Postgres / SQLite)। MSSQL/Dapper @UserId रखता है। |
| Auth | confirmed org member |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
हमलावर shared collection में vault items जोड़ता है। वे उसमें पहले से मौजूद secrets को पढ़ते या बदलते नहीं हैं।
एक confirmed org member के पास पहले से org key होती है, इसलिए नया item उन सभी के लिए decrypt हो जाता है जो उस collection को देख सकते हैं। Bitwarden इसे कंपनी vault के अंदर से एक सामान्य shared login, note, card, या SSH key के रूप में दिखाता है।
Okta, GitHub, VPN, Payroll) जैसा नाम वाला login रखें जिसका URI उनके नियंत्रित host की ओर इशारा करता हो। Collection members इसे Bitwarden से खोलते हैं और हमलावर के page पर पहुँच जाते हैं, या lookalike के विरुद्ध auto-fill कर देते हैं।new AWS key, bastion SSH key, DB password after change)। कोई इसे production या terminal में copy कर लेता है।Production पढ़ सकता है, वह भी lite EF पर उसमें नया item डाल सकता है।यदि उनके पास target collection तक access नहीं है, तो POST /api/ciphers/create write पहले ही commit हो जाने के बाद 404 लौटा सकता है। Victims को sync पर फिर भी item मिल जाता है।
मैंने 2026 की लहर के बाद bitwarden/server v2026.9.2 (9ee4e0eb) pin किया: admin-request TDE (CVE-2026-60104), SSO ExternalId truncation (CVE-2026-101878), org import empty collections (CVE-2026-43638)। वे बंद हैं। create पर Collection ACL नहीं था।
CiphersController.PostCreate केवल org membership जाँचता है, फिर जब OrganizationId सेट होता है तो skipPermissionCheck: true पास करता है। SaveDetailsAsync फिर "यह collection org में मौजूद है" को एकमात्र collection जाँच मान लेता है।
Lite MariaDB/Postgres/SQLite EF का उपयोग करते हैं। CreateAsyncReturnCipher cipher.UserId = null सेट करता है क्योंकि org id मौजूद है, फिर उस null को UpdateCollectionsAsync में दे देता है। Null user id का अर्थ है org की हर collection। SQL Server Dapper Cipher_UpdateCollections (ReadOnly = 0) के लिए @UserId रखता है। वह पथ negative है।
पहले से दर्ज गलत मोड़: cloud POST /organizations को self-host create मानना (यह [NotSelfHostedOnly] है; lite को license file चाहिए, इसलिए lab register के बाद org rows seed करता है); ऐसी collection में plant करना जिसे caller पढ़ नहीं सकता और HTTP 404 को miss मानना (CollectionCipher row पहले ही commit हो चुकी होती है); यह मानना कि MSSQL lite इसे दिखाएगा (Dapper caller id नहीं गिराता); BW_ENABLE_ADMIN बंद छोड़ना जिससे lite कभी User / OrganizationDomain migrate नहीं करता (इस image पर admin ही EF migrator है); /identity/connect/token पर Bitwarden-Client-Version छोड़ना और password grant 400 होते देखना। एक reverse shell। नाटक।
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:18160। Image ghcr.io/bitwarden/lite:2026.9.2 और MariaDB।
SUCCESS BITWARDEN-CIPHER-CREATE-ACL create-http=404 collectioncipher=1 victim-sync-has-cipher=yes cipher=<id> negative-http=404 readonly-http=200 BITWARDEN-CIPHER-CREATE-ACL-WITNESS
No-access plant, CollectionCipher commit होने के बाद 404 लौटाता है। Victim GET /api/ciphers और /api/sync दोनों में नया id मौजूद होता है। B पर read-only 200 लौटाता है और फिर भी plant कर देता है। Foreign-org collection बिना join row के 404 रहता है।
Saving user id को EF UpdateCollectionsAsync में उसी तरह पास करें जैसे CipherDetails_CreateWithCollections stored UserId column को null करने के बाद भी @UserId पास करता है। Member create पथ पर null user को "सभी collections" न मानें। Org में मौजूदगी write access नहीं है।
CiphersController.cs (Post, PostCreate)CipherService.cs (SaveDetailsAsync)CipherRepository.cs (CreateAsyncReturnCipher, UpdateCollectionsAsync)