اثرانگشت TLS و SNI، به زبان ساده
هر اتصال HTTPS با گفتوگویی آغاز میشود که آشکار انجام میگیرد. دو چیزی که در آن گفته میشود — نام سایتی که میخواهید و شیوهٔ دقیق سلامگفتن نرمافزارتان — ارزشمندترین نشانههایی هستند که یک سامانهٔ فیلترینگ در اختیار دارد.
بخشی از HTTPS که رمزگذاری نشده است
TLS نمیتواند رمزگذاریشده آغاز شود، چون دو طرف هنوز بر سر کلیدی توافق نکردهاند. بنابراین دستدادنی که آن کلید را برقرار میکند بهصورت متن آشکار فرستاده میشود، و مفصل هم هست: کلاینت نسخهها، مجموعهرمزها، منحنیهای بیضوی، الگوریتمهای امضا و فهرستی از افزونهها را پیشنهاد میدهد و سرور از میان آنچه به او پیشنهاد شده انتخاب میکند.
هر چه پس از دستدادن میآید محافظتشده است. هر چه در حین آن میگذرد برای هر کسی در مسیر خواناست. دو عنصر از آن تقریباً تمام ارزش شناسایی را حمل میکنند.
Server Name Indication: نام میزبان بهصورت آشکار
معمولاً یک نشانی IP واحد به هزاران سایت خدمت میدهد. سرور باید پیش از تکمیل دستدادن بداند کدام گواهی را ارائه کند، پس کلاینت نام میزبان موردنظرش را در افزونهای به نام Server Name Indication اعلام میکند. این نام رمزگذارینشده، در همان نخستین پیام، توسط هر کلاینت متعارفی فرستاده میشود.
برای یک سامانهٔ فیلترینگ این تقریباً ایدهآل است. مقصد موردنظر را با نام، در جایی ثابت و قابلپیشبینی میدهد، بیآنکه نیازی به دنبالکردن بیشتر اتصال یا همبستهکردن آن با DNS باشد. تطبیق آن با یک فهرست تقریباً هیچ هزینهای ندارد.
- قابلاتکاتر از مسدودسازی بر اساس نشانی است، چون یک نشانی ممکن است میزبان سایتهای خواسته و ناخواسته باشد.
- از استفاده از حلکنندهٔ DNS جایگزین، از جمله DNS رمزگذاریشده، جان سالم به در میبرد — نام دوباره، بهصورت آشکار، در خودِ اتصال اعلام میشود.
- به همان اندازه برای فهرست سفید هم به کار میآید، که پیکربندی سختگیرانهتری است: هر چه نامش در فهرست تأییدشده نیست را بینداز.
Encrypted Client Hello
Encrypted Client Hello سازوکاری است که برای بستن همین شکاف طراحی شده. کلاینت کلید عمومی سرور را از طریق DNS میگیرد، بخش حساس سلامش — از جمله نام میزبان واقعی — را رمزگذاری میکند و بهجای آن یک سلام بیرونی با نامی عمومی و کلی میفرستد. ناظر فقط آن نام عمومی را میبیند.
واقعاً کار میکند و پیشرفت معناداری است. محدودیتهایش عملی است نه نظری: به پشتیبانی هر دو سر نیاز دارد، به رکورد DNSی وابسته است که یک حلکنندهٔ خصمانه میتواند از دادنش خودداری کند، و در شبکهای که تقریباً هیچکس از آن استفاده نمیکند، همین که شما استفاده میکنید خودش متمایزکننده است. یک شبکه همچنین میتواند بهسادگی دستدادنهایی را که آن را حمل میکنند رد کند.
اثرانگشت TLS: شناسایی نرمافزار، نه سایت
نشانهٔ دوم ظریفتر است. هیچچیز در TLS ایجاب نمیکند که همهٔ کلاینتها یک چیز را به یک ترتیب پیشنهاد دهند، و در عمل هیچکدام چنین نمیکنند. Chrome مجموعهٔ خاصی از مجموعهرمزها را به ترتیبی خاص پیشنهاد میدهد، با مجموعهای خاص از افزونهها، از جمله مقادیر فریبندهٔ عامدانه. Firefox متفاوت است. کتابخانهٔ استاندارد Go بهشدت با هر دو فرق دارد. OpenSSL باز هم متفاوت است و میان نسخههایش هم تفاوت دارد.
درهمسازی آن مجموعهٔ مرتب، شناسهای کوتاه و پایدار برای نرمافزار کلاینت تولید میکند. JA3 نخستین طرح پرکاربرد بود؛ JA4 جانشین آن است و طوری طراحی شده که در برابر بُر زدنی که برخی کلاینتها اکنون عامدانه انجام میدهند مقاومتر باشد. در هر صورت نتیجه یکی است: یک ناظر میتواند بدون رمزگشایی هیچچیز بفهمد چه نوع برنامهای اتصال را باز کرده است.
| پرسش | پاسخ |
|---|---|
| کدام مرورگر یا کتابخانه این اتصال را برقرار کرده؟ | معمولاً، تا حد یک بازهٔ نسخه. |
| کدام سایت درخواست شده؟ | از روی اثرانگشت نه — آن کار SNI است. |
| چه چیزی فرستاده یا دریافت شده؟ | خیر. |
| آیا کلاینت با آنچه ادعا میکند میخواند؟ | بله، و نکته همین است. |
همین سطر آخر است که اثرانگشت را برای تونلزنی مهم میکند. اتصالی که SNI آن یک وبسایت معمولی را نام میبرد اما اثرانگشتش بهجای مرورگر متعلق به یک برنامهٔ Go است، خودش را نقض کرده است. هیچکدام از دو نشانه بهتنهایی مشکوک نیست؛ تناقض میانشان مشکوک است.
چرا تقلید سختتر از آن است که به نظر میرسد
پاسخ بدیهی این است که تونل را وادار کنیم اثرانگشت یک مرورگر را تولید کند. کتابخانههایی دقیقاً برای همین وجود دارند و کار میکنند. آنچه این کار را طاقتفرسا میکند این است که مسئلهای نیست که یک بار حلش کنید.
- مرورگرها مرتب دستدادنشان را تغییر میدهند، همانطور که مجموعهرمزها بازنشسته میشوند و تبادل کلید پساکوانتومی راه میافتد. اثرانگشتی که یک سال پیش با Chrome همخوانی داشت اکنون با هیچچیز همخوانی ندارد، که از تقلیدنکردن هم بدتر است.
- برخی مرورگرها عامدانه ترتیب افزونهها را تصادفی میکنند، پس تقلید ایستا از یک نمونهٔ ضبطشده خودش یک ناهنجاری است.
- اثرانگشت باید با همهچیز دیگر سازگار باشد: نسخهٔ توافقشده، مقدار ALPN، اندازهٔ رکوردهایی که در پی میآیند، زمانبندی نخستین درخواست.
- اثرانگشتی که نادر باشد حتی وقتی بهعنوان تونل شناخته نشده باشد یک نشانه است. غیرعادیبودن بهتنهایی کافی است.
اصل کلی که ارزش بهخاطرسپردن دارد این است که پنهانشدن دربارهٔ رمزگذاریشدهبودن یا غیرعادیبودن نیست. دربارهٔ سازگاری است — اینکه همهٔ لایهها یک روایت واحد بگویند، و آن روایت، روایت کسلکننده باشد.
پرسشهای پرتکرار
آیا شبکهٔ من میتواند ببیند چه سایتهایی را با HTTPS بازدید میکنم؟
تقریباً در همهٔ موارد میتواند نام میزبان را ببیند، چون بهصورت آشکار در دستدادن TLS فرستاده میشود. نمیتواند صفحهٔ مشخص، محتوا، یا چیزی را که ارسال میکنید ببیند. Encrypted Client Hello در جایی که هر دو سر پشتیبانی کنند نام میزبان را هم پنهان میکند.
اثرانگشت JA3 چیست؟
درهمسازی میدانهای مرتبی که یک کلاینت در Client Hello خود پیشنهاد میدهد — نسخه، مجموعهرمزها، افزونهها، منحنیها و قالبهای نقطه. بهجای کاربر، نرمافزار کلاینت را شناسایی میکند و هم در پایش امنیتی و هم در فیلترینگ کاربرد گسترده دارد. JA4 طرح جدیدتری با همین هدف است.
آیا VPN مقدار SNI را پنهان میکند؟
آن را جابهجا میکند. دستدادن سایتهایی که از طریق تونل بازدید میکنید درون کانال رمزگذاریشده انجام میشود، جایی که شبکهٔ محلی نمیتواند بخواندشان. خودِ اتصال به تونل یک نشست TLS جداگانه با دستدادن خودش است، و هر چه در آن میدان بگذارد همان چیزی است که شبکه میبیند.