CVE-2026-12046 - pgAdmin 4: Unauthenticated pickle deserialization in SQL Editor close / update_connection routes enables remote code execution
Özet
Bu kayıt, hedef sistemde bulunan bir zafiyeti detaylandırmaktadır. Zafiyet 2026-06-18 tarihinde yayınlanmış olup, topluluktan 237 görüntülenme almıştır. uzaktan kategorisinde sınıflandırılmıştır. Kullanıcıların teknik detaylar için Detay sekmesindeki kaynak kodunu incelemeleri önerilir.
Zafiyet Ozet Bilgileri
Zafiyet Detayi (Turkce)
pgAdmin 4'ün SQL Editör planındaki iki durum değiştiren uç nokta - DELETE /sqleditor/close/<trans_id> ve POST /sqleditor/initialize/sqleditor/update_connection/<sgid>/<sid>/<did> - modülde @pga_login_required dekoratörünün eksik olduğu tek rotalardı. Her ikisi de oturum['gridData'][<trans_id>]['command_obj'] üzerinde bir pickle.loads havuzuna ulaşır: close_sqleditor_session() aracılığıyla yakın uç noktaya ve check_transaction_status() yoluyla update_sqleditor_connection'a. Sunucu modunda bu uç noktalara kimliği doğrulanmış herhangi bir pgAdmin oturumu olmadan ulaşılabilir. Kusur, güvenilmeyen veri havuzunun (CWE-502) seri durumdan çıkarılmasının etrafındaki kritik işlevde eksik kimlik doğrulama (CWE-306) sarmalayıcısından kaynaklanıyor. Bunu uzaktan kod yürütmek için kullanmak, saldırganın aynı zamanda gridData girişi kötü amaçlı bir turşu yükü içeren sunucu tarafı bir oturum dosyası oluşturmasını gerektirir; bu da hem (a) pgAdmin'in Flask SECRET_KEY bilgisi (burada sızdırılacak bir zincir yoktur - saldırganın zaten buna sahip olması gerekir) hem de (b) pgAdmin'in ana bilgisayardaki oturumlar/ dizinine yazma erişimi gerektirir. Bu kusurun hiçbir ön şartı tek başına sağlanmaz. Bu ön koşullar başka bir kanaldan karşılandığında (yanlış yapılandırılmış dağıtım, önceki uzlaşma, sızdırılmış yapılandırma), eksik kimlik doğrulama kapısı, mevcut kısmi bir uzlaşmayı pgAdmin sürecinde ve buna bağlı olarak pgAdmin'i çalıştıran hesap altındaki ana bilgisayarda kimliği doğrulanmamış kod yürütmeye dönüştüren son atlama noktasıdır. Fix, iki uç noktanın her birinde, modüldeki diğer tüm yolların kullandığı kuralla eşleşen tek satırlık bir @pga_login_required dekoratörüdür. is_authenticated / MFA zinciri artık trans_id'nin referansı kaldırılmadan önce çalışıyor, dolayısıyla kimliği doğrulanmamış bir istek seri durumdan çıkarma yoluna ulaşmadan önce reddediliyor. Kusur yalnızca sunucu modundadır. MASAÜSTÜ modunda pgAdmin'in before_request kancası her istekte DESKTOP_USER'ın kimliğini yeniden doğrular, böylece kimliği doğrulanmamış bir durumda hiçbir uç nokta kullanılamaz ve hiçbir kimlik doğrulama dekoratörü (veya yokluğu) anlamlı değildir. Eşlik eden regresyon testi, saldırganın yolunu yansıtır - GET /login'den bir X-pgA-CSRFToken toplar ve onu her iki uç noktaya karşı tekrar oynatır - ve bu nedenle sunucu modunun dışına kendiliğinden atlar; veri izolasyon testlerinin yanı sıra mevcut sunucu modu CI iş akışına bağlanır. Bu sorun pgAdmin 4'ü etkilemektedir: 6.9'dan 9.16'ya.
Orijinal Aciklama (Ingilizce)
Two state-mutating endpoints in pgAdmin 4's SQL Editor blueprint -- DELETE /sqleditor/close/<trans_id> and POST /sqleditor/initialize/sqleditor/update_connection/<sgid>/<sid>/<did> -- were the only routes in the module missing the @pga_login_required decorator. Both reach a pickle.loads sink on session['gridData'][<trans_id>]['command_obj']: the close endpoint via close_sqleditor_session(), and update_sqleditor_connection via check_transaction_status(). In server mode these endpoints were reachable without any authenticated pgAdmin session. The defect is a missing-authentication-on-critical-function (CWE-306) wrapper around a deserialization-of-untrusted-data sink (CWE-502). Exploiting it for remote code execution requires the attacker to also forge a server-side session file whose gridData entry contains a malicious pickle payload, which in turn requires both (a) knowledge of pgAdmin's Flask SECRET_KEY (no chain to leak it is described here -- the attacker must already possess it) and (b) write access to pgAdmin's sessions/ directory on the host. Neither precondition is granted by this defect on its own. When those preconditions are met from another channel (misconfigured deployment, prior compromise, leaked configuration), the missing auth gate is the final hop that turns an existing partial compromise into unauthenticated code execution in the pgAdmin process -- and, by extension, on the host under whatever account runs pgAdmin. Fix is a one-line @pga_login_required decorator on each of the two endpoints, matching the convention used by every other route in the module. The is_authenticated / MFA chain now runs before the trans_id is dereferenced, so an unauthenticated request is rejected before reaching the deserialization path. The defect is server-mode only. In DESKTOP mode pgAdmin's before_request hook re-authenticates DESKTOP_USER on every request, so no endpoint can be exercised in an unauthenticated state and no auth decorator (or its absence) is meaningful. The accompanying regression test mirrors the attacker's path -- harvests an X-pgA-CSRFToken from GET /login and replays it against both endpoints -- and self-skips outside server mode for that reason; it is wired into the existing server-mode CI workflow alongside the data-isolation tests. This issue affects pgAdmin 4: from 6.9 before 9.16.
Kaynak Kodu İndir
Çevrimdışı analiz ve test için exploit kaynak kodunu indirin.
Şimdi İndirDosya Boyutu: ~7.1 KB | MD5: b8a2bf913f7c3d07f9bc54b8de3739e7
Galeri görseli bulunmuyor.
Henüz tartışma başlatılmamış.