این صفحه ترجمه است. اگر با نسخهٔ انگلیسی فرق داشته باشد، ملاک نسخهٔ انگلیسی است. نسخهٔ انگلیسی
دادههای شما چطور محافظت میشوند
از شما نمیخواهیم به ما اعتماد کنید. این صفحه دقیقاً توضیح میدهد چه چیزهایی رمزگذاری میشوند، سرور ما چه چیزهایی را میتواند ببیند و چه چیزهایی را نمیتواند، و چطور میتوانید هر ادعا را خودتان بررسی کنید.
در یک دقیقه
- سرورها، اطلاعات ورود، کلیدها و یادداشتهای شما در یک فایل روی دستگاهتان نگهداری میشوند که با AES-256-GCM رمزگذاری شده است. چند انتخاب مخصوص همین دستگاه، مثل ظاهر برنامه و پوشهای که با یک سرور RDP به اشتراک گذاشته شده، بدون رمزگذاری در تنظیمات برنامه نگه داشته میشوند و هیچوقت همگامسازی نمیشوند.
- کلید با Argon2id از رمز پروفایل شما ساخته میشود؛ روشی که عمداً کند است تا حدس زدن رمز پرهزینه باشد. رمز هیچوقت در جایی ذخیره یا به جایی فرستاده نمیشود.
- اگر همگامسازی را روشن کنید، هر آیتم پیش از آپلود روی دستگاه شما رمزگذاری میشود. سرور دادههایی را نگه میدارد که نمیتواند رمزگشایی کند.
- البته سرور لایهٔ بیرونی دادههای شما را میبیند: نشانی ایمیل شما، اینکه چه زمانی و از چه نشانی IP همگامسازی میکنید، از هر نوع چند آیتم دارید و حجمشان چقدر است، نام پروفایلهایتان، و در پروفایلهای اشتراکی، نام اشتراکها و نشانی ایمیل اعضا.
- برنامه نه تبلیغات دارد، نه آمارگیری، نه گزارش خرابی.
سرور نمیتواند اینها را بخواند
- محتوای آیتمهای شما: نامها، نشانیها، پورتها، نامهای کاربری، رمزها، کلیدهای خصوصی و عبارت عبورشان، تونلها، یادداشتها، فرمانها، نام پوشهها
- اینکه کدام اطلاعات ورود یا کلید مال کدام سرور است
- اینکه چه کسی یک آیتم را تغییر داده است
- رمز پروفایل شما، عبارت عبور اشتراکگذاری شما و کلیدهایی که پروفایلهایتان را باز میکنند
سرور میتواند اینها را ببیند
- نشانی ایمیل شما، و رمز حسابتان هنگام ورود (سرور فقط یک هش bcrypt از آن را ذخیره میکند)
- نشانی IP و زمان ورودها و همگامسازیها
- اینکه یک پروفایل از هر نوع چند آیتم دارد، حجم آنها، و اینکه هر کدام چه زمانی و با کدام دستگاه (یک شناسهٔ تصادفی) تغییر کرده است
- نام پروفایلهای شما
- در پروفایلهای اشتراکی: نام اشتراکها، نشانی ایمیل اعضا و نقش آنها
هنگام همگامسازی چه اتفاقی میافتد
۱. روی دستگاه شما
هر پروفایل یک فایل است. داخل آن یک پایگاهدادهٔ کوچک با سرورها، اطلاعات ورود، کلیدهای SSH، یادداشتها و تنظیمات شماست. کل پایگاهداده اول فشرده و بعد با AES-256-GCM رمزگذاری میشود. هر بار که فایل ذخیره میشود، یک nonce تصادفی تازه به کار میرود. فایل هم اول در یک نسخهٔ موقت نوشته میشود؛ برای همین، از کار افتادن ناگهانی برنامه نمیتواند فایلی نیمهکاره به جا بگذارد.
کلید با Argon2id از رمز پروفایل شما به دست میآید، با ۶۴ MiB حافظه، ۳ دور (pass) و ۴ مسیر (lane)، و یک salt تصادفی برای هر پروفایل. این تنظیمات در خود برنامه ثابت شدهاند، پس فایلی که تغییر داده شده باشد نمیتواند آنها را ضعیفتر کند.
رمز هیچوقت روی دیسک نوشته نمیشود و به هیچجا فرستاده نمیشود. پس از ساخته شدن کلید، نسخهٔ رمز در هستهٔ برنامه پاک میشود، و وقتی پروفایل را قفل کنید، کلید هم پاک میشود. قفل کردن همهٔ اتصالها را هم میبندد و ورودی را که هنوز در جریان است لغو میکند. اگر رمز را فراموش کنید، پروفایل باز نمیشود. راهی برای بازنشانی نیست، چون هیچجا چیزی که بتواند آن را باز کند نگهداری نمیشود.
قفلگشایی سریع (Quick unlock) اختیاری است و بهطور پیشفرض خاموش است. در Windows از Windows Hello و TPM استفاده میکند و در Android از حسگر اثر انگشت و Android Keystore. سیستم کلید پروفایل را نگه میدارد و هیچوقت رمز شما را نگه نمیدارد؛ این کلید هم هیچوقت همگامسازی نمیشود. در Android، پشتیبانگیری ابری سیستم از دادههای برنامه خاموش است.
در Windows، وقتی Remote Desktop Connection سروری را باز میکند که رمز ذخیرهشده دارد، برنامه رمز را در یک فایل .rdp کوتاهعمر به آن میدهد. رمز داخل این فایل با Windows DPAPI برای کاربر Windows شما رمزگذاری شده است، و فایل به محض اینکه Remote Desktop Connection آن را خواند، حذف میشود (حداکثر پس از ۳۰ ثانیه؛ فایلی که بر اثر از کار افتادن ناگهانی برنامه جا بماند، دفعهٔ بعد که برنامه اجرا شود پاک میشود).
- استخراج کلید (تنظیمات Argon2id) lib.rs:237–254
- AES-256-GCM با یک nonce تازه lib.rs:256–263
- ذخیرهٔ فایل پروفایل lib.rs:431–486
- رمز برای Remote Desktop Connection (DPAPI) rdp.rs:178–193
۲. همگامسازی ابری (Cloud sync)
همگامسازی تا وقتی وارد حساب نشوید خاموش است. هر پروفایل کلید دادهٔ تصادفی ۲۵۶ بیتی خودش را دارد که داخل همان پروفایل رمزگذاریشده نگهداری میشود. پیش از آپلود، هر آیتم (سرور، اطلاعات ورود، کلید، یادداشت…) جداگانه با این کلید رمزگذاری میشود، با AES-256-GCM و یک nonce تصادفی تازه.
سرور در کنار هر آیتم رمزگذاریشده اینها را هم دریافت میکند: یک شناسهٔ تصادفی، نوع آیتم، یک برچسب زمانی و یک پرچم که نشان میدهد آیتم حذف شده است یا نه. برچسب زمانی شامل شناسهٔ تصادفی دستگاهی است که تغییر را انجام داده است. حجم آیتم رمزگذاریشده تقریباً نشان میدهد خود آیتم چقدر بزرگ است. سرور نام هر پروفایل را هم ذخیره میکند. کلیدهای میزبان شناختهشده (known host keys)، تاریخچهٔ فرمانها، تنظیمات پایش و انتخابهای مخصوص همین دستگاه هیچوقت همگامسازی نمیشوند.
سرور برای یک آیتم اینها را ذخیره میکند: (نمونه)
{
"uuid": "6f1c2e0a9b7d4c3e8a5f0d1b2c3e4f50",
"entity_type": "servers",
"updated_at": "001761043562118:00000:9f3a61c2d4e5b7a8",
"deleted": false,
"blob": "4e8a1f0c2b9d3e7a5c6f8b1d0a2e4c6b8d0f1a3c5e7b9d1f…"
}- رمزگذاری هر آیتم همگامشده lib.rs:1050–1056
- آنچه برای هر آیتم فرستاده میشود lib.rs:1086–1124
۳. باز کردن پروفایل روی دستگاه جدید
برای باز کردن یک پروفایل همگامشده روی دستگاهی دیگر، آن دستگاه به کلید دادهٔ پروفایل نیاز دارد. برای همین سرور یک رکورد دیگر هم نگه میدارد: کلید داده، رمزگذاریشده با کلیدی که از رمز پروفایل شما ساخته میشود، با همان تنظیمات Argon2id. سرور نمیتواند آن را باز کند.
اگر مهاجمی روزی دادههای سرور را بدزدد، اصلیترین کاری که میتواند امتحان کند هم همین است: حدس زدن رمز پروفایل شما بهصورت آفلاین. هر حدس یک اجرای کامل Argon2id هزینه دارد، پس یک رمز طولانی که جای دیگری از آن استفاده نمیکنید، دادههایتان را امن نگه میدارد.
- نسخهٔ ذخیرهشدهٔ کلید پروفایل lib.rs:1551–1569
- باز کردن آن روی دستگاه جدید lib.rs:1574–1594
۴. رمز حساب شما
حساب همگامسازی شما رمز خودش را دارد، جدا از رمز پروفایل. این رمز هنگام ورود، از طریق HTTPS، به سرور فرستاده میشود و سرور فقط یک هش bcrypt از آن را ذخیره میکند. پس از ۵ بار رمز اشتباه، ورود با رمز به مدت ۱۵ دقیقه متوقف میشود.
این سرویس پشت Cloudflare قرار دارد و Cloudflare اتصال HTTPS را برایش مدیریت میکند. بنابراین Cloudflare هم، مثل خود سرور، میتواند هنگام ورود رمز حساب شما را ببیند، اما آیتمهای شما را فقط به شکل رمزگذاریشده میبیند.
رمز پروفایل را هیچوقت بهعنوان رمز حساب به کار نبرید. در این صورت، هیچ چیزی که سرور یا Cloudflare ببیند نمیتواند پروفایلهای شما را باز کند.
- درخواست ورود cloud.rs:105–108
۶. اگر سرور متخاصم باشد
امنیت خوب فقط به کاری که سرور قرار است انجام دهد محدود نمیشود. در ادامه آمده است که کسی با کنترل کامل سرور چه کارهایی میتواند بکند و چه کارهایی نمیتواند.
نمیتواند
- آیتمهای شما را بخواند، یا محتوای آنها را بدون اینکه تغییر شناسایی شود عوض کند
- نسخهٔ ذخیرهشدهٔ کلید پروفایل شما را بدون رمز پروفایل باز کند
- رمز پروفایل یا عبارت عبور اشتراکگذاری شما را بفهمد؛ برنامه هیچوقت اینها را نمیفرستد
- برنامهٔ روی دستگاه شما را تغییر دهد: بهروزرسانی خودکار وجود ندارد و برنامه فقط نشان میدهد که نسخهٔ جدیدی آمده است
میتواند
- تلاش کند یک رمز پروفایل ضعیف را بهصورت آفلاین حدس بزند؛ برای هر حدس، یک اجرای کند Argon2id
- دفعهٔ بعد که وارد حساب میشوید، رمز حساب شما را به دست بیاورد
- آیتمها را حذف کند، نسخههای قدیمیتر را برگرداند، یا جلوی رسیدن تغییرات را بگیرد. پیش از آنکه همگامسازی چیزی را حذف کند، برنامه یک نسخه از پروفایل شما را روی دستگاهتان نگه میدارد
- وقتی کسی را به یک پروفایل اشتراکی دعوت میکنید، کلید عمومی نادرستی تحویل دهد
- جزئیاتی را که در جدول بالا آمده است ببیند
۷. همهٔ جاهایی که برنامه به آنها وصل میشود
سرورهای خودتان، و پراکسیها و jump hostهایی که برایشان تنظیم کردهاید. سرور همگامسازی، فقط وقتی وارد حساب شدهاید. و GitHub، برای بررسی نسخهٔ جدیدتر: وقتی فهرست پروفایلها باز میشود و وقتی «Check for updates» را میزنید، برنامه از فهرست عمومی نسخههای منتشرشده در GitHub پرسوجو میکند. این درخواست فقط نام و نسخهٔ برنامه را با خود دارد.
در برنامه هیچ کدی برای آمارگیری، گزارش خرابی یا تبلیغات وجود ندارد. برنامه برای همگامسازی فقط به فهرست داخلی خودش از مراجع صدور گواهی اعتماد میکند و هیچوقت از تغییر مسیر (redirect) پیروی نمیکند؛ بنابراین نمیشود بیسروصدا آن را به سمت سرور دیگری فرستاد.
- بررسی بهروزرسانی about.rs:75–139
۸. دسکتاپ راه دور چه چیزی از دستگاه شما دریافت میکند
کلیپبورد. متنی که در یک تب RDP یا VNC میچسبانید به همان سرور میرود، و تا وقتی چیزی را نچسبانید، هیچ چیزی در اختیار آن گذاشته نمیشود. وقتی Share the clipboard روشن است (که پیشفرض است و برای هر سرور جداگانه قابل تغییر است)، متنی که روی دسکتاپ راه دور کپی شود، روی کلیپبورد همین دستگاه قرار میگیرد. این فقط متن است، هیچوقت فایل نیست، و VNC فقط متن سادهٔ ASCII را منتقل میکند.
فایلها، فقط با کلاینت داخلی RDP روی کامپیوتر، و فقط اگر برای آن سرور یک پوشه یا یک درایو انتخاب کنید؛ اگر بخواهید، فقطخواندنی. سرور آن را به شکل یک درایو زیر \\tsclient میبیند و هیچ چیز دیگری از کامپیوتر شما را نمیبیند. هر مسیری که سرور درخواست کند بررسی میشود: .. پذیرفته نمیشود و در طول مسیر هیچ لینکی دنبال نمیشود؛ بنابراین به هیچ چیزی بیرون از آنچه انتخاب کردهاید نمیشود دسترسی پیدا کرد.
این انتخابها روی همین دستگاه نگه داشته میشوند و هیچوقت همگامسازی نمیشوند؛ بنابراین هیچکدام از کسانی که پروفایلی را با آنها به اشتراک میگذارید نمیتوانند آنها را روشن کنند.
- نگه داشتن مسیرهای یک پوشهٔ اشتراکی در محدودهٔ خود آن پوشه rdp_share.rs:121–147
- آنچه کلیپبورد VNC اجازه دارد منتقل کند vnc_client.rs:180–188
خودتان بررسی کنید
لازم نیست هیچکدام از اینها را فقط به حرف ما قبول کنید. در ادامه چند راه برای بررسی آمده است، از ساده تا پیشرفته.
کد را بخوانید
برنامه متنباز است. پیوندهای این صفحه دقیقاً به خطهایی از کد میروند که این کارها را انجام میدهند، در همان نسخهای که این صفحه توصیف میکند (
c9dec31).اتصالها را زیر نظر بگیرید
از یک فایروال یا ابزار پایش شبکه استفاده کنید. سرورهای خودتان را میبینید، سرور همگامسازی را فقط وقتی وارد حساب هستید، و api.github.com را وقتی فهرست پروفایلها باز میشود. هیچ چیز دیگری نمیبینید.
ببینید سرور چه چیزی ذخیره میکند
پیشرفته: توکن ورود خود را از پوشهٔ دادههای برنامه (cloud_token.json) بردارید و دادههایتان را با هدر X-Auth-Token از API بخواهید: GET /api/sync/profiles، یا POST /api/sync با یک فهرست خالی از رکوردها. در پاسخ فقط شناسهها، نوعها، زمانها، پرچمها و متن رمزگذاریشده دریافت میکنید. بعد از آن، در برنامه از حساب خارج شوید تا آن نشست بسته شود.
ترافیک را بخوانید
پیشرفته: یک پراکسی کوچک روی کامپیوترتان اجرا کنید که درخواستها را به سرور واقعی برساند، و سرور همگامسازی برنامه را روی http://127.0.0.1 و پورت پراکسی تنظیم کنید. برنامه HTTP ساده را فقط برای کامپیوتر خودتان مجاز میداند. میبینید برنامه چه چیزی میفرستد، و اینکه آیتمهای شما رمزگذاریشدهاند. (گواهی پراکسیای که به سیستم خود اضافه کنید کار نمیکند، چون برنامه از فهرست خودش از مراجع صدور گواهی استفاده میکند.)
دادههای خودتان را رمزگشایی کنید
پیشرفته: با رمز خودتان میتوانید دادههایتان را با هر ابزاری برای Argon2id و AES-GCM باز کنید، با تنظیماتی که در جدول زیر آمده است. بدون رمز، هیچکس نمیتواند.
فایل دانلودشده را بررسی کنید
مقدار checksum را با فایل SHA256SUMS در نسخهٔ منتشرشده مقایسه کنید (از نسخهٔ 0.4 به بعد)، گواهی برنامهٔ Android را با apksigner بررسی کنید، یا برنامه را از کد منبع بسازید.
تنظیمات، برای ابزارهای خودتان
| استخراج کلید | Argon2id، نسخهٔ 0x13، ۶۴ MiB حافظه، ۳ دور (pass)، ۴ مسیر (lane)، کلید ۳۲ بایتی، salt تصادفی ۱۶ بایتی |
| فایل پروفایل | “OMNV” · نسخهٔ ۱ · salt ۱۶ بایتی · nonce ۱۲ بایتی · رمزگذاری AES-256-GCM پایگاهدادهٔ SQLite که با zstd فشرده شده است، همراه با tag ۱۶ بایتی آن |
| آیتم همگامشده | hex(nonce ۱۲ بایتی · متن رمزگذاریشده و tag حاصل از AES-256-GCM)، با کلید دادهٔ ۲۵۶ بیتی پروفایل |
| نسخهٔ ذخیرهشدهٔ کلید پروفایل | hex(0x02 · salt ۱۶ بایتی · nonce ۱۲ بایتی · رمزگذاری AES-256-GCM کلید دادهٔ ۳۲ بایتی)، با کلیدی که از رمز پروفایل شما ساخته میشود |
| اشتراکگذاری | X25519، HKDF-SHA256، AES-256-GCM |
آنچه این صفحه وعده نمیدهد
- Submarine ممیزی امنیتی مستقلی نداشته است. بررسیهایی که تا امروز انجام شده، کار خود سازنده بوده است.
- رمز ضعیف، یا رمزی که جای دیگری هم از آن استفاده کردهاید، ضعیفترین نقطه است. برای پروفایل از یک رمز طولانی و یکتا استفاده کنید، و برای حساب از رمزی متفاوت.
- Telnet و VNC ساده ذاتاً رمزگذاری ندارند. برنامه آنها را علامتگذاری میکند و میتواند آنها را از طریق یک سرور SSH اجرا کند. روی VNC ساده، متن کلیپبورد هم، چه آنچه شما میچسبانید و چه آنچه سرور کپی میکند، بدون رمزگذاری از شبکه میگذرد.
- کلاینت داخلی RDP آزمایشی است (از یک کامیت IronRDP ساخته شده است، نه از یک نسخهٔ منتشرشده) و تا وقتی آن را برای یک سرور انتخاب نکنید، خاموش است.
- این صفحه برنامه را در کامیت
c9dec31توصیف میکند. اگر کد تغییر کند، این صفحه هم همراه با آن تغییر میکند.