زمانی که پارامترهای DH مبتنی بر اعداد اول ایمن تولید نشود، باعث وجود مشکلاتی می‌شود. زمانی که یک برنامه از پیکربندی DH با پارامتر‌های مبتنی بر روی اعداد اولی که ایمن نیستند استفاده ‌کند، یک مهاجم می‌تواند از این اصل برای حمله استفاده کند. این مشکل در OpenSSL 1.0.2f برطرف شده است، اما نسخه‌های ۱٫۰٫۲e, 1.0.2d, 1.0.2c, 1.0.2b, 1.0.2a, 1.0.2 آسیب‌پذیرند.

۱    میزان تأثیر آسیب‌پذیری CVE-2016-0701

۱-۱    جدول تأثیر آسیب‌پذیری بر اساس شاخص شدت و معیارهای CVSS v2.0

CVE-2016-0701

۱-۲    جدول تأثیر آسیب‌پذیری بر اساس شاخص شدت و معیارهای CVSS v3.0

OpenSSL

۲    تحلیل آسیب‌پذیری CVE-2016-0701

از لحاظ تاریخی، OpenSSL معمولاً پارامترهای DH را مبتنی بر اعداد اول ایمن تولید نکرده است. اخیراً (در نسخه ۱٫۰٫۲) پشتیبانی برای پارامترهای تولیدی به سبک X9.42 (مانند آن‌هایی که پشتیبانی RFC 5114 را نیاز دارند) ارائه شده بود. اعداد اول استفاده شده در همچنین فایل‌هایی ممکن است ایمن نباشد. زمانی که یک برنامه از پیکربندی DH با پارامتر‌های مبتنی بر روی اعداد اولی که ایمن نیستند استفاده ‌کند، سپس یک مهاجم می‌تواند از این اصل برای پیدا کردن یک تعریف‌کننده DH خصوصی همسان(۱) استفاده کند. این حمله نیازمند این است که یک حمله‌کننده، چند handshake را کامل کند که در آن، peer از همان تعریف‌کننده DH خصوصی استفاده می‌کند. برای مثال این مورد می‌تواند برای کشف یک تعریف‌کننده DH خصوصی مربوط به یک سرویس‌دهنده TLS استفاده بشود؛ اگر آن در حال استفاده مجدد از تعریف‌کننده DH خصوصی است یا در حال استفاده از دنباله‌های رمز ایستای DH(2) است.

OpenSSL گزینه SSL_OP_SINGLE_DH_USE را برایDHE(3) فراهم می‌کند. این مورد به صورت پیش‌فرض وجود ندارد. اگر این گزینه برقرار نشده باشد، سرویس‌دهنده از همان تعریف‌کننده DH خصوصی استفاده مجدد می‌کند و این کار می‌تواند به این حمله، آسیب‌پذیر باشد. باور بر این است که خیلی از برنامه‌های کاربردی محبوب، این گزینه را به‌درستی تنظیم می‌کنند و خود را در معرض خطر قرار نمی‌دهند. OpenSSl قبل از ۱٫۰٫۲f، اگر از SSL_CTX_set_tmp_dh()/SSL_set_tmp_dh() استفاده کند و SSL_OP_SINGLE_DH_USE را برقرار نکند، در واقع از کلید استفاده مجدد خواهد کرد و در معرض خطر قرار خواهد داشت.

از SSL_CTX_set_tmp_dh_callback()/SSL_set_tmp_dh_callback() استفاده شده است و پارامترها و کلیدهاست شده‌اند و همچنین از SSL_OP_SINGLE_DH_USE استفاده نشده است. این یک ویژگی مستند نشده است و فایل‌های پارامتر شامل کلید نمی‌شوند. کلید قسمتی از گواهی است و همیشه از آن استفاده مجدد خواهد کرد. این امر تنها در نسخه ۱٫۰٫۲ پشتیبانی شده است.

اعداد اول ناامن توسط OpenSSL در زمانی که از dh_rfc5114 با گزینه dh_rfc5114 استفاده می‌کند، تولید می‌شوند. این فایل به فرمت X9.42 که شامل زیر گروه prime-order به اندازه q است، نوشته خواهد شد. این از نسخه ۱٫۰٫۲ به بعد پشتیبانی می‌شود و نسخه‌های قدیمی نمی‌توانند فایل‌هایی که از این راه تولید شده‌اند را بخوانند. برای حل این مشکل باید یک بررسی اضافی در جایی که پارامتر “q” در دسترس است انجام شود (مانند آنچه که در X9.42 در دسترس است). این فقط حمله شناخته شده را تشخیص می‌دهد و دفاع تنها برای دنباله‌های رمز DH ایستا ممکن است. این امر می‌تواند تأثیراتی روی کارایی داشته باشد. به اضافه گزینه SSL_OP_SINGLE_DH_USE به صورت پیش‌فرض برقرار شده است و نمی‌تواند آن را غیرفعال کرد. این مورد توسط Antonio Sanso (Adobe) در ۱۲ ژانویه ۲۰۱۶ گزارش شده است.

  • این مشکل در OpenSSL 1.0.2f برطرف شده است، اما نسخه‌های زیر آسیب‌پذیرند:

۱٫۰٫۲e, 1.0.2d, 1.0.2c, 1.0.2b, 1.0.2a, 1.0.2

۱-۲    شرح دقیق حمله

حمله واقعی، برگرفته از مقاله “A Key Recovery Attack on Discrete Log-based Schemes Using a Prime Order Subgroup” است که در [۱] قرار دارد. این یک حمله بسیار حساب شده و در عین حال ساده است. در اینجا چگونگی انجام آن را بیان می‌کنیم و برای جزئیات بیشتر به [۱] مراجعه شود.

در نام‌گذاری  کلاسیک DH موارد زیر را داریم:

  • P به عنوان عدد اول
  • g به عنوان مولد به مرتبه p-1=q
  • y کلید عمومی
  • x کلید خصوصی

برای اینکه حمله به صورت کارا انجام شود، دو پیش‌نیاز وجود دارد:

  1. مهاجم باید چند handshake را کامل کند که OpenSSL از همان تعریف‌کننده DH خصوصی استفاده می‌کند و این برای پیکربندی پیش‌فرض OpenSSL برای دنباله‌های رمز DHE (به‌عبارت‌دیگر، SSL_OP_SINGLE_DH_USE is not set ست نشده است) درست است و برای دنباله‌های رمز DH ایستا همیشه درست است. همان‌طور که در بالا ذکر شد، اکثر برنامه‌های کاربردی محبوب (مثل g. Apache mod_ssl) SSL_OP_SINGLE_DH_USE را ست می‌کنند.
  2. DH با پارامترهای مبتنی بر اعداد اولی که ناامن هستند پیکربندی شده باشد یا اینکه Lim-Lee [1] نباشد. این در مورد RFC 5114 که p-1 = 2 *3 * 3 * 5 * 43 * 73 * 157 * 387493 * 605921 * 5213881177 * 3528910760717 * 83501807020473429349 * C489 (که C489 برابر با ۴۸۹ رقم عدد مرکب(۴) است) خوب است اما مشکل آن محدود به RFC 5114 نمی‌شود. توجه داشته باشید که به منظور تولید فایل پارامتر RFC 5114 در فرمت ۴۲ با استفاده از openssl، می‌توان از دستور زیر استفاده کرد:

openssl genpkey -genparam -algorithm DH -pkeyopt dh_rfc5114:2

این دستور، چیزی شبیه زیر را تولید خواهد کرد:

—–BEGIN X9.42 DH PARAMETERS—–
MIICKQKCAQEArRB+
HpEjqdDWYPqnlVnFH6INZOVoO5/
RtUsVl7YdCnXm+hQd+VpW
۲۶+
aPEB7od8V6z1oijCcGA4d5rhaEnSgp m0/gVKtasISkDfJ7e/aTfjZHo/
vVbc5
S3rVt9C2wSIHyfmNEe002/
bGugssi7wnvmoA4KC5xJcIs7+
KMXCRiDaBKGEwvImF
۲xYC5xRBXZMwJ4Jzx94x79xzEPcSH9
WgdBWYfZrcCkhtzfk6zEQyg4cxXXXh
mMZB
pIDNhqG55YfovmDmnMkosrnFIXLkEw
QumyPxCw4W55djybU9z0uoCinj+
۳PBa451
uX7zY+L/ox9xz53lOE5xuBwKxN/+
DBDmTwKCAQEArEAy708tmuOd8wtcj/
۲sUGze
vnuJmYyvdIZqCM/k/+
OmgkpOELmm8N2SHwGnDEr6q3OddwDC
n1LFfbF8YgqGUr5e
kAGo1mrXwXZpEBmZAkr00CcnWsE0i7
inYtBSG8mK4kcVBCLqHtQJk51U2nRg
zbX2
xrJQcXy+
۸YDrNBGOmNEZUppF1vg0Vm4wJeMWoz
Dvu3eobwwasVsFGuPUKMj4rLcK
gTcVC47rEOGD7dGZY93Z4mPkdwWJ72
qiHn9fL/
OBtTnM40CdE81Wavu0jWwBkYHh
vP6UswJp7f5y/ptqpL17Wg8ccc//
TBnEGOH27AF5gbwIfypwZbOEuJDTGR
۸r+gId
AIAcDTTFjZP+mXF3EB+
AU1pHOM68vziambNjces=
—–END X9.42 DH PARAMETERS—–

که اعداد هگزادسیمال زیر را تعریف می‌کند:

p
=  AD107E1E 9123A9D0 D660FAA7 9559C51F A20D64E5 683B9FD1
B54B1597 B61D0A75 E6FA141D F95A56DB AF9A3C40 7BA1DF15
EB3D688A 309C180E 1DE6B85A 1274A0A6 6D3F8152 AD6AC212
۹۰۳۷C9ED EFDA4DF8 D91E8FEF 55B7394B 7AD5B7D0 B6C12207
C9F98D11 ED34DBF6 C6BA0B2C 8BBC27BE 6A00E0A0 B9C49708
B3BF8A31 70918836 81286130 BC8985DB 1602E714 415D9330
۲۷۸۲۷۳C7 DE31EFDC 7310F712 1FD5A074 15987D9A DC0A486D
CDF93ACC 44328387 315D75E1 98C641A4 80CD86A1 B9E587E8
BE60E69C C928B2B9 C52172E4 13042E9B 23F10B0E 16E79763
g =
AC4032EF 4F2D9AE3 9DF30B5C 8FFDAC50 6CDEBE7B 89998CAF
۷۴۸۶۶A08 CFE4FFE3 A6824A4E 10B9A6F0 DD921F01 A70C4AFA
AB739D77 00C29F52 C57DB17C 620A8652 BE5E9001 A8D66AD7
C1766910 1999024A F4D02727 5AC1348B B8A762D0 521BC98A
E2471504 22EA1ED4 09939D54 DA7460CD B5F6C6B2 50717CBE
F180EB34 118E98D1 19529A45 D6F83456 6E3025E3 16A330EF
BB77A86F 0C1AB15B 051AE3D4 28C8F8AC B70A8137 150B8EEB
۱۰E183ED D19963DD D9E263E4 770589EF 6AA21E7F 5F2FF381
B539CCE3 409D13CD 566AFBB4 8D6C0191 81E1BCFE 94B30269
EDFE72FE 9B6AA4BD 7B5A0F1C 71CFFF4C 19C418E1 F6EC0179
۸۱BC087F 2A7065B3 84B890D3 191F2BFA
q =
۸۰۱C0D34 C58D93FE 99717710 1F80535A 4738CEBC BF389A99
B36371EB

حال توجه کنید که حمله چگونه به نظر می‌رسد:

  • فرض کنید که سرویس‌دهنده (در اینجا OpenSSL) کلید خصوصی DH خود را xb انتخاب کند.
  • سپس yb = g ^ xb (mod p)

سپس مهاجم:

  • B را انتخاب می‌کند که ord(B) کوچک است و برابر با یکی از فاکتورهای کوچک p-1 است (به‌عنوان‌مثال در RFC 5114، ord(B) برابر با ۲ یا ۳ یا ۵ یا ۴۳ یا ۷۳ یا ۱۵۷ یا ۳۸۷۴۹۳ است).
  • انتخاب xa
  • محاسبه yb = g * xa (mod p) * B
  • با دریافت کردن xb، مهاجم با استفاده از جستجوی جامع (برای TLS این به معنی تلاش برای handshake در جلسات(۵) زیاد است) سعی می‌کند تا yb^xa * B^xa (mod p) را به دست آورد.
  • در این مرحله مهاجم j = xb (mod ord(B)) را پیدا کرده است.
  • بعد از اینکه یک‌بار این کار انجام شد، مهاجم ممکن است برخی از مراحل بالا را با یک B’ (از نظر محاسباتی امکان‌پذیر) که ord(B’) کوچک است، تکرار کند.
  • اسرار جزئی(۶) می‌تواند با استفاده از قضیه(۷) Chinese Remainder [3] ترکیب شوند.
  • و برای بیت‌هایی که هنوز باقی‌مانده‌اند، روش‌ Shanks و روش lambdaی Pollard می‌تواند استفاده شود.

۱-۱-۲    ایمن‌سازی

با توجه به آنچه که قبلاً گفته شد، به منظور کار کردن با DH به صورت امن، در RFC 5114 دو گزینه وجود دارد:

  1. در دنباله‌های رمز DH هرگز از کلیدها استفاده مجدد نکنید.
  2. مقدار peer را اعتبار سنجی کنید. این مورد می‌تواند به‌سادگی با بررسی تساوی ya^q (mod p)=1 انجام شود.

برطرف کردن مشکل توسط OpenSSL برای این موضوع، یک بررسی اضافی را در جایی که یک پارامتر “q” در دسترس است، اضافه کرده است (پارامترهای متکی بر X9.42).

منابع

[۱] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.44.5296

[۲] http://126kr.com/article/6kopiit5p3a

[۳] https://en.wikipedia.org/wiki/Chinese_remainder_theorem

[۴] https://www.openssl.org/news/vulnerabilities.html#y2016

[۵] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-0701

[۶] https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-0701


(۱) peer’s private DH exponent
(۲) static DH ciphersuite
(۳) ephemeral DH
(۴) composite number
(۵) sessions
(۶) partial secrets
(۷) Theorem