Erlang/OTP CVE-2026-89422: جعل سرور با PSK ناخواسته در TLS 1.3

/images/erlang-otp-cve-2026-89422.png

کلاینت Erlang قرار است بعد از ssl:connect بداند طرف مقابل همان سروری است که گواهی‌اش را می‌شناسد. CVE-2026-89422 آن قرارداد را می‌شکند: peerی که به اتصال TLS 1.3 جواب می‌دهد می‌تواند سرور را جعل کند بدون اینکه گواهی، کلید خصوصی، یا session قبلی داشته باشد. امتیاز CVSS 4.0 در رکورد CVE: ۹٫۳ (Critical). ضعف: CWE-322 — Key Exchange without Entity Authentication.

مکانیک کوتاه است. در handle_server_hello/2، اگر ServerHello شامل extension pre_shared_key باشد، کد آن را به handle_resumption/2 می‌دهد و فقط به‌خاطر وجود extension، resumption = true می‌شود — بدون چک اینکه کلاینت اصلاً PSK پیشنهاد کرده یا نه. هم‌زمان get_pre_shared_key/4 وقتی ticket نیست به مقدار all-zero «no PSK» برمی‌گردد و handshake با schedule غیر‌PSK کلید می‌شود؛ کلید ephemeral مهاجم کافی است. فلگ resumption مسیر را مستقیم به wait_finished می‌برد و stateهای certificate را رد می‌کند: path validation، verify_fun، hostname verification، partial_chain، CRL و OCSP همه bypass می‌شوند. پیکربندی پیش‌فرض کلاینت در معرض است؛ کلاینتی که فقط TLS 1.2 را مجاز کرده نه.

بازه: OTP از 22.2 تا قبل از فیکس‌ها؛ متناظر با اپلیکیشن ssl از 9.5 تا قبل از 11.2.12.13 / 11.6.0.6 / 11.7.7. پچهای امن:

  • OTP 27.3.4.18+
  • OTP 28.5.0.7+
  • OTP 29.1.1+

جزئیات در GHSA-rgxr-4g4w-j875. تا ارتقا، محدود کردن کلاینت به {versions, ['tlsv1.2']} مسیر حمله را می‌بندد. هر سرویس Elixir/Erlang که با ssl به API، دیتابیس، یا broker وصل می‌شود و هنوز روی شاخهٔ قدیمی OTP است، باید نسخهٔ runtime را قبل از «فعلاً کار می‌کند» چک کند — چون {ok, Socket} دیگر به‌معنی احراز هویت سرور نیست.

آخرین مطالب