
Vaultwarden 1.37.3 الافتراضي X-Real-IP trusted-local يتجاوز حدود معدل تسجيل الدخول على Docker NAT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vaultwarden-ip-header-spoof
Vaultwarden 1.37.3 - dani-garcia
الإعداد الافتراضي IP_HEADER=X-Real-IP مع IP_HEADER_TRUSTED_PROXIES=local يعامل أي نظير TCP غير عام كوسيط عكسي. منفذ Docker المنشور عبر NAT هو RFC1918. يصبح X-Real-IP المُرسَل من العميل هو مفتاح تحديد المعدل. القيم الفريدة لا تتشارك أبداً في الانفجار.
| ID | لا يوجد CVE بعد |
| CWE | CWE-307 / CWE-290 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Product | Vaultwarden |
| Affected | 1.37.3 (eb212e23). Image vaultwarden/server:1.37.3. Docker published-port / userland-proxy / Desktop NAT، أو أي نظير RFC1918. |
| Auth | unauthenticated |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 فقط |
يقوم المهاجم بإزالة الحماية من القوة الغاشمة المعتمدة على IP. يرسل X-Real-IP جديداً في كل محاولة. الحاكم هو DashMap مفتاحه ذلك العنوان، لذا لا ينطلق الانفجار والفترة أبداً.
POST /identity/connect/token password-grant. الانفجار الافتراضي هو 10 لكل 60 ثانية لكل IP. الرؤوس الفريدة تعيد تعيين الدلو./api/two-factor/send-email-login، POST /admin، بالإضافة إلى unauth hint / prelogin / delete-recover / auth-request / Send access كلها تعتمد على ClientIp.docker run -p 80:80 و compose 80:80 القياسيان يجعلان النظير عنوان bridge أو Desktop NAT. trusted=local هو !is_global(peer). هذا يطابق.الوسيط العكسي الذي يستبدل X-Real-IP بالعميل الحقيقي، وربط المضيف الذي نظيره عنوان عام، كلاهما يحافظ على أمانة الحاكم. الثغرة هي الإعداد الافتراضي بالإضافة إلى منفذ منشور بدون استبدال.
قمت بتثبيت dani-garcia/vaultwarden 1.37.3 (eb212e23) بعد GHSAs الخاصة بـ 1.35.x / 1.36.0 / 1.37.0. GHSA-c5rv وضعت send-email-login على LIMITER_LOGIN. المتبقي هو كيفية اختيار ClientIp.
config.rs يجعل ip_header افتراضياً X-Real-IP و ip_header_trusted_proxies افتراضياً local. auth.rs ip_header_is_trusted يعامل local كـ !is_global(remote). ratelimit.rs يعتمد LIMITER_LOGIN على ذلك IpAddr. Docker bridge، Desktop VM NAT، و loopback كلها غير عامة.
قمت بتشغيل vaultwarden/server:1.37.3 القياسي على loopback 127.0.0.1:18170:80 بدون overwrite-proxy، بالإضافة إلى نسخة ثانية على 18171 مع IP_HEADER=none. سجلت [email protected]. password-grant بكلمة مرور خاطئة وبدون رأس أعاد 429 عند الطلب 11 (انفجار 10). نفس الـ grant مع X-Real-IP: 198.51.100.{n} فريد لكل محاولة بقي HTTP 400 أربع عشرة مرة، صفر 429. على نسخة none، 203.0.113.{n} الفريد لا يزال أعاد 429 عند 11.
SUCCESS VAULTWARDEN-IP-HEADER-SPOOF nohdr-429-at=11 spoof-400=14 spoof-429=0 none-429-at=11 VAULTWARDEN-IP-HEADER-SPOOF-WITNESS
المنعطفات الخاطئة المسجلة بالفعل: صورة 1.37.3 لم تكن محلية، لذا انتظر أول compose على pull؛ أول /alive كان رداً فارغاً بينما كان Rocket يربط، ثم 200 عند الانتظار 2؛ dummy register JSON (masterPasswordHash + key قصير) كان كافياً، لا إعادة محاولة بمفتاح طويل. reverse shell. مسرح. الأوراكل هو 429 بدون الرأس و 400 مع رأس فريد.
cd lab
./run.sh
الهدف فقط http://127.0.0.1:18170 (افتراضي) و http://127.0.0.1:18171 (IP_HEADER=none). الصورة vaultwarden/server:1.37.3.
اجعل IP_HEADER افتراضياً none، أو اجعل IP_HEADER_TRUSTED_PROXIES افتراضياً قائمة فارغة / CIDR وسيط صريح. local كـ "أي نظير RFC1918" هو حالة المنفذ المنشور. وجود رأس إعادة توجيه ليس دليلاً على وسيط.
src/config.rs (ip_header, ip_header_trusted_proxies)src/auth.rs (ip_header_is_trusted, ClientIp)src/ratelimit.rs