رفتن به محتوا

مدل تهدید

مدل تهدید کامل در فایل THREAT_MODEL.md در مخزن اصلی نگهداری می‌شود. نسخه مرجع همان فایل است و بسیار دقیق‌تر است. این صفحه خلاصه‌ای کوتاه برای اپراتورها و کاربران است.

در برابر چه مهاجمانی طراحی شده

Section titled “در برابر چه مهاجمانی طراحی شده”
  • مهاجمی که شبکه را زیر نظر دارد، ثبت می‌کند و سرورها را فعالانه بررسی می‌کند (سانسورچی). این مهم‌ترین حالت است. وضعیت لایه مبهم‌سازی می‌گوید ترنسپورت‌ها در برابر آن چه می‌کنند و چه چیزی را قابل‌دیدن باقی می‌گذارند.
  • ارائه‌دهنده بدخواه، و اشتراک، فایل پوسته، لینک یا کارت ارائه‌دهنده بدخواه.
  • نشست دزدیده‌شده پنل، نود نفوذشده و همتای بدخواه داخل تونل.
  • پروکسی بالادستی بدخواه، میزبان آینه ثابت و افزونه Xray.
  • هر کس به ورودی پراکسی نود برسد، ورودی‌های پراکسی را ببینید.
  • مهاجم روی مسیر به‌روزرسانی و دانلود، مهاجم زنجیره تأمین و مهاجم شبکه محلی (مثلا نقطه دسترسی یا سرور DHCP جعلی).

هر تجزیه‌گری که ورودی شبکه، داده اشتراک، فایل پوسته یا محتوای ارائه‌دهنده را می‌خواند، ورودی دست مهاجم فرض می‌شود.

برای محافظت از چه چیزهایی طراحی شده

Section titled “برای محافظت از چه چیزهایی طراحی شده”
  • محتوای ترافیک شما بین اپ و نود، که WireGuard آن را رمزنگاری می‌کند.
  • اشتراک شما، که اپ پیش از خواندن آن امضای ارائه‌دهنده را بررسی می‌کند.
  • مسیرها و تنظیمات DNS دستگاه شما، با کلید قطع (kill switch) تا ترافیک بیرون از تونل نرود.
  • کاربران دیگر یک نود در برابر کاربر بدخواه، در چارچوب قوانین مسیریابی نود.

نود می‌تواند ورودی‌های پراکسی socks5، http و mixed داشته باشد که به نرم‌افزارهای دیگر اجازه می‌دهند از آن مثل پراکسی ساده استفاده کنند (از v0.2.17). شنونده‌هایی بدون پوشش‌اند: هیچ چیزشان شبیه یک سایت نیست و هیچ‌چیز در آن‌ها رمزگذاری نمی‌شود. هر اتصال با گذرواژهٔ پراکسی یک کاربر وارد می‌شود، و بعد از همان دروازهٔ مقصد، قاعده‌ها، نقطه‌های خروج، مجوز استفاده، سهمیه و شمارنده‌های تونل می‌گذرد. مدل کامل بخش 5.16 فایل THREAT_MODEL.md است، با خطرهای P1 تا P10. معنایش برای اپراتور:

  • رمزگذاری‌نشده. هر کس روی مسیر باشد گذرواژه، هر مقصد و محتوا را می‌خواند. فقط loopback بدون هشدار می‌گذرد. نشانی خصوصی هشدار می‌دهد، چون ممکن است به یک نشانی عمومی NAT شده باشد. هر نشانی دیگر public: true می‌خواهد و هشدار می‌دهد. پنل ورودی پراکسی را ناامن (Unsafe) رتبه می‌دهد. روی loopback گوش بدهید، پشت یک تونل یا پوشش TLS که خودتان اداره می‌کنید.
  • پراکسی باز نیست. روش ناشناس وجود ندارد. SOCKS5 فقط نام کاربری و گذرواژه عرضه می‌کند و HTTP با 407 جواب می‌دهد. ورود یعنی کاربری از پیکربندی که proxy_password دارد و ورودی او را می‌پذیرد. کاربر غیرفعال، منقضی یا ردشده از سهمیه رد می‌شود، و قطع شدن اتصال‌های کاربر را ظرف یک ثانیه تمام می‌کند.
  • حدس زدن. گذرواژه 16 تا 128 نویسه دارد. مبدأیی که ظرف 60 ثانیه 10 ورود به یک نام را ناموفق بزند آن نام را رد می‌گیرد، و صبر برای یک نام با شکست‌هایش بیشتر می‌شود. تعداد اتصال، اتصال برای هر مبدأ و ورودهای ناتمام سقف دارند.
  • UDP ورود مخصوص خودش را ندارد. رله فقط دیتاگرام‌های آدرس کلاینت و، بیرون از loopback، از پورتی را می‌برد که کلاینت گفته. کلاینت پشت NAT UDP نمی‌گیرد مگر اپراتور udp_any_port را روشن کند، که به فرستنده‌ای که آدرس کلاینت را شریک است اجازه می‌دهد پیش از اولین دیتاگرام کلاینت همبستگی را بگیرد.
  • راهی به loopback یا شبکه‌های تونل نود نیست. دروازهٔ مقصد loopback، link-local، آدرس‌های فراداده ابری و هر بازهٔ تونل را پیش از هر قاعده رد می‌کند. آدرس‌های عمومی خود نود باز است، مگر قاعدهٔ host:self ردشان کند، دسترسی به خود سرور را ببینید. نام‌ها را نود resolve می‌کند، هرگز میزبان.
  • درخواستی که دیگری را قاچاق کند. خوانندهٔ HTTP سخت‌گیر و کران‌دار است، یک درخواست ساده برای هر اتصال برده می‌شود، و چیزی که پشت آن نوشته شود به مبدأ نمی‌رسد. یک fuzz target هر دو جلوی کار را می‌پوشاند.

آنچه دفاع نمی‌شود: هر چه بالا «رمزگذاری‌نشده» گفته؛ سانسورچی‌ای که پورت را پیدا کند می‌تواند آن را ببندد و بفهمد چیست؛ هر کس گذرواژهٔ پراکسی کاربری را بفهمد تا وقتی عوض نشود روی هر ورودی پراکسی که او را می‌پذیرد همان کاربر است؛ و اپراتور می‌بیند کاربران از راه نود چه می‌کنند. این مدل را هنوز کسی بیرون از پروژه بازبینی نکرده است.

یک نود می‌تواند ترافیک یک خروجی را از راه سرور VLESS، VMess، Trojan یا Shadowsocks یک طرف دیگر بفرستد (v0.2.18 و بعد از آن). مدل کامل بخش 5.17 در THREAT_MODEL.md است، با خطرهای X1 تا X8. برای اپراتور یعنی:

  • ارائه‌دهنده آنچه خروجی می‌برد را می‌بیند. صاحب آن نشانی نود، هر مقصد و هر بایتی را که مقصد خودش محافظت نکرده می‌بیند، برای همهٔ کاربرانی که از آن می‌گذرند. کاربران، نشانی‌های تونل و کلیدهایشان را نمی‌بیند. از او ناشناسی نیست.
  • سرور ارائه‌دهنده نمی‌تواند به نود برگردد. نشانی مستقیم باید قاعده‌های اتصال نود را بگذراند، و نام را خود نود جست‌وجو می‌کند، نه Xray و نه تحلیل‌گر میزبان. آن جست‌وجو DNS ساده روی UDP است، پس هر کس DNS نود را ببیند می‌تواند نام ارائه‌دهنده را ببیند. برای پنهان کردنش نشانی را بنویسید.
  • هیچ چیز دور اتصال بیرونیِ از کار افتاده نمی‌چرخد. جریان با یک دلیل تمام می‌شود. به direct، خروجی دیگر یا پیش‌فرض ارائه‌دهنده نمی‌رود، و unsupported.udp چنین خروجی‌ای نمی‌تواند direct یا via باشد.
  • پیوند اشتراک را همان خواننده‌ای می‌خواند که برنامهٔ دسکتاپ، و آنچه می‌گذرد به فیلدهای نوع‌دار تبدیل می‌شود. پیوند هیچ‌وقت نگه داشته، نشان داده یا ثبت نمی‌شود، و گواهی‌ها همیشه بررسی می‌شوند.
  • سوکت‌ها مال Xray هستند. هر اتصال بیرونی یک سوکت Unix در پوشه‌ای است که فقط کاربر نود و کاربر Xray می‌توانند وارد آن شوند، با گذرواژه‌ای که با هر شروع تازه ساخته می‌شود. نود پیش از فرستادن یک بایت بررسی می‌کند که سوکت مال کاربر Xray است.
  • تغییر، Xray را دوباره راه می‌اندازد، که کاربران ورودی‌های Xray را لحظه‌ای قطع می‌کند.

آنچه دفاع نمی‌شود: خروج خود Xray که یونیتش محدودش نمی‌کند، پس باگ در Xray به نشانی ارائه‌دهنده محدود نیست؛ بایت‌های ارائه‌دهندهٔ بدخواه که Xray می‌خواندشان، پس نقصی در Xray-core اعتبارنامه‌های اتصال‌های بیرونی و جریان‌های همهٔ کاربران Xray را به مهاجم می‌دهد؛ و در دسترس بودن، چون ارائه‌دهنده می‌تواند خروجی را قطع کند. فقط نودهای لینوکسی آن را اجرا می‌کنند. این مدل را کسی بیرون از پروژه بررسی نکرده است.

اتصال‌های بیرونی WireGuard

Section titled “اتصال‌های بیرونی WireGuard”

یک نود می‌تواند ترافیک یک خروجی را از راه سرور WireGuard یک طرف دیگر بفرستد (v0.3.6 و بعد از آن). مدل کامل بخش 5.20 در THREAT_MODEL.md است، با خطرهای W1 تا W7. برای اپراتور یعنی:

  • سرور خروجی را می‌بیند. صاحبش نشانی نود، هر مقصد و هر بایتی را که مقصد خودش محافظت نکرده می‌بیند، برای همهٔ کاربرانی که از آن می‌گذرند. کاربران، نشانی‌های تونل و کلیدهایشان را نمی‌بیند: هر جریان از یک نشانی تونل بیرون می‌رود. از او ناشناسی نیست، و سرور بدخواه می‌تواند جواب DNS و محتوای محافظت‌نشده را جعل کند.
  • سرور نمی‌تواند به نود برسد. هر چه بفرستد و جواب جریانی نباشد که نود باز کرده، دور ریخته و شمرده می‌شود و هرگز جواب داده نمی‌شود: نه reset، نه جواب ping، نه درگاه باز. صف‌ها و تعداد جریان‌هایش محدودند، پس سیل حافظهٔ نود را بزرگ نمی‌کند. یک کاربر حداکثر یک‌چهارم جریان‌ها را نگه می‌دارد.
  • کاربران می‌توانند به شبکهٔ خود سرور برسند. همتاهای دیگر و بازه‌های خصوصی‌اش برایشان باز است، مگر اینکه قاعدهٔ مسیریابی آن بازه‌ها را رد کند. نود فقط نشانی‌ها و شبکه‌های خودش را می‌بندد، و اعتبارسنجی دربارهٔ هر اتصال بیرونی WireGuard هشدار می‌دهد.
  • نام جعلی نمی‌تواند نود را به خودش بفرستد. نشانی‌ای که loopback باشد، در بازهٔ یک ورودی باشد یا مال خود نود باشد رد می‌شود. نشانی جعلی به جای دیگر نمی‌تواند دست‌دهی را تمام کند، چون کلید سرور در پیکربندی است، پس اتصال بیرونی از کار می‌افتد و جز دست‌دهی چیزی فرستاده نمی‌شود.
  • چیزی دور تونلِ از کار افتاده نمی‌چرخد. حدود 20 ثانیه بعد از ساکت شدن سرور اتصال بیرونی از کار افتاده است، و هر جریان خروجی با دلیل تمام می‌شود. هرگز به direct، خروجی دیگر یا پیش‌فرض نمی‌رود، و unsupported.udp نمی‌تواند direct یا via باشد.
  • کلیدها سر جایشان می‌مانند. کلیدها هرگز نشان داده یا ثبت نمی‌شوند. کلید نباید جای دیگری از پیکربندی استفاده شده باشد، پس لو رفتن یکی چیز دیگری را باز نمی‌کند.

آنچه محافظت نمی‌شود: UDP بیرونی WireGuard ساده است و سانسورچی می‌تواند بشناسد و ببندد (جایی که مهم است اتصال بیرونی Xray بگذارید)؛ هر اتصال بیرونی روی یک هسته اجرا می‌شود و هر جریان را دو بار تمام می‌کند، پس سرعتش محدود است؛ ایرادی در کد WireGuard یا TCP/IP که نود روی بایت‌های سرور اجرا می‌کند برای همان سرور قابل دسترسی است؛ و سروری که دست‌دهی را تمام کند و بعد همه‌چیز را دور بریزد اتصال بیرونی را تا rekey یا keepalive بعدی بالا نگه می‌دارد، حدود 35 ثانیه روی تونل پرترافیک و تا 2.5 دقیقه روی تونل بیکار. این مدل را کسی بیرون از پروژه بازبینی نکرده است.

از v0.3.6 کاربران به سرویس‌های روی آدرس‌های عمومی نود می‌رسند، مگر قاعده‌ای رد کند. نام مسیریابی host:self یعنی هر آدرسی که ماشین دارد، که هر 60 ثانیه از رابط‌ها خوانده می‌شود. اپراتوری که سرویس‌های دیگری آنجا اجرا می‌کند (پنل دیگر، پایگاه داده، پورت مدیریت) {"tag": "no-self", "ip": ["host:self"], "action": "reject"} را به قاعده‌ها اضافه می‌کند. این قاعده برای هر خروجی، هر ورودی و هر پیوند نود برقرار است. چیزی این قاعده را برای اپراتور اضافه نمی‌کند. دسترسی به خود سرور را ببینید.

  • باز هم رد می‌شود، قاعده هرچه باشد: loopback، link-local، آدرس‌های فراداده ابری و هر بازهٔ تونل. پنل فقط روی 127.0.0.1 گوش می‌دهد، پس کاربران نمی‌توانند به آن برسند.
  • آنچه قاعده نمی‌تواند نام ببرد: آدرسی که هیچ رابطی ندارد (آدرس عمومی پشت NAT یک‌به‌یک)، آدرس anycast و آدرس broadcast. این‌ها در دسترس می‌مانند.
  • سرویسی که روی همهٔ آدرس‌ها گوش می‌دهد از هر کدام در دسترس است، تا وقتی قاعده اضافه شود.
  • آدرس دروازه به DNS، ping و در ورودی veilway به کانال کنترل جواب می‌دهد، فقط برای ورودی خودش.

یک پیوند دو نود را به هم وصل می‌کند و مدل کاملش در صفحهٔ پیوندهای نود و مدل تهدید است. برای اپراتور یعنی:

  • جفت‌سازی بر دو اثر انگشت تکیه دارد که اپراتورها برای هم می‌خوانند. چیز دیگری از جفت‌سازی محافظت نمی‌کند، و توافق کلید در آن بازبینی بیرونی نداشته است.
  • پیوند خودامضا به همان اثر انگشت تکیه دارد. نامزد tls با self_signed فقط با پین‌هایش مورد اعتماد است، بدون مرجع صدور گواهی. هر کس فایل کلید آن ترنسپورت را بدزدد می‌تواند خودش را جای خروجی جا بزند، تا وقتی پیوند دوباره جفت شود.
  • کلید تازه گفته می‌شود، پنهان نمی‌شود. نود پین هر ترنسپورت tls را به یاد دارد و وقتی عوض شود یک بار هشدار می‌دهد و پیوندهایی که کلید قدیمی را پین کرده‌اند نام می‌برد. گواهی تازه را باز هم ارائه می‌دهد. نودی که شماره می‌گیرد pin_mismatch گزارش می‌دهد، نه «در دسترس نیست»، و هرگز به حالت بدون پین برنمی‌گردد.
  • زنجیر کردن به‌طور پیش‌فرض خاموش است. با allow_chain روی نیمهٔ خروج، ترافیک یک پیوند می‌تواند از پیوند دیگری ادامه دهد، حداکثر 3 پیوند پشت سر هم، هرگز از upstream. حد گام فقط محافظ حلقه میان نودهایی است که از آن پیروی می‌کنند. نودِ ورودی نمی‌تواند آنچه در نود میانی می‌گذرد را ببیند یا محدود کند، و آن نود هر مقصد جریان‌هایی که رد می‌کند را می‌بیند. Chaining و Pins and self-signed links را ببینید.

اشتراک ارائه‌دهندگان دیگر

Section titled “اشتراک ارائه‌دهندگان دیگر”

خروجی‌ای که از اشتراک ارائه‌دهندهٔ دیگری استفاده می‌کند (upstream) تابع بخش 5.15 در THREAT_MODEL.md است، با خطرهای U1 تا U9. ارائه‌دهنده نشانی نود و هر مقصد، نام DNS و بایت محافظت‌نشدهٔ جریان‌هایی که به او فرستاده می‌شود را می‌بیند. ارائه‌دهندهٔ بدخواه نمی‌تواند نود را به سمت میزبان یا شبکه‌های خودش بکشاند: هر نشانی اتصال هر پروفایلی که فهرست می‌کند، اگر loopback، بازهٔ یک ورودی، خود نود یا خصوصی باشد (مگر مجاز شده)، رد می‌شود. شکست‌گذر میان پروفایل‌ها محدود است، پس ارائه‌دهنده با قطع کردن نمی‌تواند نود را در میان آن‌ها بچرخاند. PATCH /v1/upstreams/{tag} فقط پروفایل، شکست‌گذر، ترنسپورت و خروجی را عوض می‌کند، هرگز پیوند، کلیدها یا آنچه نود اجازهٔ اتصال به آن دارد را. هیچ چیز دور upstream از کار افتاده نمی‌چرخد.

speed_up و speed_down یک کاربر فقط دیر می‌کنند یا دور می‌ریزند. هرگز جریانی را مسیر دیگری نمی‌دهند و تصمیم یک قاعده را عوض نمی‌کنند. TCP که نود به‌صورت جریان نگه می‌دارد دیر می‌شود و ترافیک دیگر بالاتر از حد دور ریخته و شمرده می‌شود. DNS و کانال کنترل هرگز دور ریخته نمی‌شوند. حد برای هر نود است، پس کاربری که هم‌زمان روی چند نود آنلاین است روی هر کدام حد را می‌گیرد، و سقف برای هر حساب ساخته نشده است.

خروجی‌ای که تنظیم load دارد به دستگاه‌ها سطحی از کم، متوسط یا زیاد می‌گوید، نه هرگز عدد. سطح فقط وقتی عوض می‌شود که در دو نگاه با فاصلهٔ 10 ثانیه مانده باشد، و تغییر حداکثر دقیقه‌ای یک بار به دستگاه گفته می‌شود. پس یک همتا حداکثر می‌فهمد خروجی شلوغ‌تر شده، یک دقیقه دیرتر، نه اینکه یک کاربر دیگر کی شروع یا تمام می‌کند. بدون این تنظیم نود چیزی از ترافیک بقیهٔ کاربران نمی‌فرستد.

در برابر چه چیزهایی محافظت نمی‌کند

Section titled “در برابر چه چیزهایی محافظت نمی‌کند”
  • تشخیص. هیچ ترنسپورتی غیرقابل‌تشخیص یا غیرقابل‌مسدودسازی معرفی نمی‌شود. همه ترنسپورت‌ها Detectable رتبه‌بندی می‌شوند.
  • ناظری که هر دو سر را می‌بیند. کسی که اتصال شما و سمت دور نود را با هم زیر نظر دارد، می‌تواند آن‌ها را با زمان‌بندی و حجم تطبیق دهد.
  • ارائه‌دهنده. نود آدرس شما، هر سایتی که باز می‌کنید و هر نامی که جستجو می‌کنید را می‌بیند. Veilway یک VPN است، نه شبکه ناشناس‌ساز.
  • دستگاه، نود یا میزبان پنل نفوذشده. اقدام‌های طراحی فقط دامنه گسترش یک نفوذ را محدود می‌کنند و از ماشین نفوذشده محافظت نمی‌کنند.
  • حمله‌های سنگین ازکارانداختن سرویس به آدرس نود و دسترسی فیزیکی به دستگاه بازشده.
  • امنیت خود پروتکل‌های Xray. امنیت آن‌ها همان است که نرم‌افزار Xray فراهم می‌کند.

issue عمومی باز نکنید. از فرم خصوصی‌ای که در SECURITY.md آمده استفاده کنید: گزارش آسیب‌پذیری. آدرس واقعی سرور، کلید، گذرواژه و لینک اشتراک را از گزارش حذف کنید.