پرش به محتوا
امنیت

آنچه از یک فضای کاری محافظت می‌کند، ساده و بی‌تعارف.

نه گواهی‌نامه‌ای که نداریم، نه صفتی به‌جای کنترل. اینجا می‌بینید چه چیزی اعمال می‌شود، کجا اعمال می‌شود، و چه چیزی کم است.

شانزده فضای کاری، و هیچ چیز میانشانشبکه‌ای چهار در چهار از سلول‌های فضای کاری، که هر کدام اپراتورها، کلیدها، نسخه‌های پیکربندی و یک گزارش ممیزی را در خود دارد. فاصله‌های میان آن‌ها با خطوط توپر رسم شده‌اند و هیچ مسیری در هیچ کجای این نقشه از آن‌ها عبور نمی‌کند. یک سلول با سه برابر اندازه باز شده است: مخزنی محدود به همان فضای کاری، یک کلید API و یک راز وب‌هوک که هر یک شناسهٔ کلید دارند، و یک گزارش ممیزی فقط‌افزودنی که با تریگر پایگاه داده تضمین می‌شود.فضاهای کاریجداسازی ساختاری است01020304050607080910111213141516یک فضای کاریworkspace_idهر پرس‌وجو در لایهٔ داده یکی می‌گیردapi_key(kid)در بازه‌ای هم‌پوشان چرخانده می‌شودwebhook_secret(kid)به همان شکل چرخانده می‌شودaudit_logفقط افزودنی — با تریگر پایگاه داده اعمال می‌شودهیچ مسیری از شکاف عبور نمی‌کند — نبودِ مسیر، خودِ نکته استهر پرس‌وجو در لایهٔ داده یک فضای کاری می‌گیرد. هیچ فراخوانی‌ای نمی‌تواند آن را حذف کند.
شانزده فضای کاری. میان هیچ دو خانه‌ای خطی کشیده نشده، چون میان آن‌ها چیزی نمی‌توان نوشت.
چند-مستأجری

جداسازی ساختاری است، نه نظارتی.

هر پرس‌وجو روی دادهٔ متعلق به یک فضای کاری، شناسهٔ آن فضا را در شرطش دارد. مسیر دسترسی بدون این محدودیت وجود ندارد که کسی یادش برود از آن استفاده کند.

خرابی‌ای که این طراحی حذفش می‌کند همان خرابی همیشگی است: سامانه‌ای درست، که در آن یک اندپوینت تازه که با عجله نوشته شده یک شرط WHERE را جا انداخته. اگر لایهٔ داده به پرسشی که نام فضای کاری در آن نیست پاسخ ندهد، آن اندپوینت به یک نشتی کامپایل نمی‌شود — اصلاً کامپایل نمی‌شود.

آزمون‌های نشتِ خصمانه این ویژگی را تثبیت می‌کنند، به‌جای اینکه به قرارداد نانوشته اعتماد شود؛ چون یک قرارداد نانوشته فقط به‌اندازهٔ آخرین کسی که فایل را خوانده معتبر است.

internal/tenancy · migrations/0002

سابقه

گزارش ممیزی در پایگاه داده فقط-افزودنی است، نه در برنامه.

یک تریگر روی هر به‌روزرسانی یا حذف خطا می‌دهد. برنامه‌ای که تصمیم می‌گیرد تاریخ را بازنویسی نکند یک سیاست است؛ پایگاه داده‌ای که از آن سر باز می‌زند یک کنترل است.

این همان تفاوتی است که حسابرس دربارهٔ آن می‌پرسد و فروشنده معمولاً پاسخی ندارد. اگر تنها چیزی که جلوی ویرایش عطف‌به‌ماسبق را می‌گیرد این باشد که هیچ مسیری در کد چنین کاری نمی‌کند، آنگاه یک اسکریپت پشتیبانی، یک مهاجرت پایگاه داده یا اپراتوری با یک کنسول می‌تواند این کار را بکند و گزارش هرگز نمی‌فهمد.

internal/tenancy · migrations/0002 audit_log_immutable()

اعتبارنامه‌ها

کلیدها بدون قطعی چرخش می‌کنند. ورود در برابر فیشینگ مقاوم است.

چرخشی که به پنجرهٔ تعمیرات نیاز دارد، چرخشی است که انجام نمی‌شود.

دو حجم، و صفحهٔ میانشاندو حجم ایزومتریک که روی دو تکه زمینِ خط‌کشی‌شدهٔ جدا از هم ایستاده‌اند، با صفحه‌ای عمودی میانشان که از لبه دیده می‌شود. حجم چپ از آنِ اپراتور است و به چهار محفظه تقسیم شده: Stripe، NOWPayments، بانک و کیف‌پول. حجم راست از آنِ پلتفرم است و به دفتر کل، اجراها، درخواست‌های برداشت و صندوق خروجی تقسیم شده. چهار خط از صفحهٔ میانی عبور می‌کنند و روی خودِ صفحه برچسب خورده‌اند: رویداد، دستور، رسید و فرمان. هیچ خطی پول حمل نمی‌کند، و حجم راست هیچ محفظه‌ای ندارد که بتواند موجودی نگه دارد.دو حجم · یک صفحه · بدون درSTRIPEدفترNOWPAYMENTSاجراهابانکبرداشت‌هاکیف پولصندوق خروجیاپراتورXEXمرز نگهداری داراییرویداددستوررسیدفرمانهیچ حجمی عبور نمی‌کندپول در محفظه‌های اپراتور می‌ماند و هرگز در محفظه‌های ما رونوشت نمی‌شود.چهار چیز از این صفحه عبور می‌کنند. هیچ‌کدام موجودی نیست و هیچ‌کدام کلید نیست.
دو حجم و یک صفحه میان آن‌ها. دری در آن نیست.
  1. 01

    شناسهٔ کلید، با اعتبار هم‌پوشان

    کلیدهای API و کلیدهای امضای وب‌هوک هر فضای کاری یک شناسهٔ کلید دارند. در طول چرخش هر دو معتبرند، پس با برنامهٔ زمانی خودتان جابه‌جا می‌شوید و بعد کلید قدیمی را باطل می‌کنید.

    internal/tenancy · internal/outbox/sign.go

  2. 02

    پس‌کی برای اعضا و برای اپراتورها

    WebAuthn با احراز کاربر و اجبار به اعتبارنامهٔ قابل‌کشف — نه اختیاری، چون این کلیدها جلوی یک جریان پولی نشسته‌اند. ورود قابل‌کشف حساب را از روی خودِ اعتبارنامه پیدا می‌کند، پس چیزی تایپ نمی‌شود و چیزی برای فیشینگ باقی نمی‌ماند.

    internal/passkey

  3. 03

    دو-عاملی با اپلیکیشن، ذخیره‌شده به شکل درست

    راز TOTP را نمی‌شود هش کرد — تأیید، کدها را دوباره از روی آن می‌سازد — پس رازهای اعضا با AES-256-GCM و زیرکلیدی مخصوص همان کاربرد مهر و موم می‌شوند، نه اینکه آشکار ذخیره شوند. شمارندهٔ هر کد پذیرفته‌شده بازنوشته می‌شود، پس یک کد را نمی‌شود درون پنجرهٔ اعتبارش دوباره استفاده کرد.

    internal/membertotp · internal/secretbox

  4. 04

    هرجا می‌شود هش، هرجا نمی‌شود مهر و موم

    رمز عبور یا کد بازیابی هش می‌شود، چون پلتفرم فقط باید بتواند بگوید «همین است یا نه؟». رازی که پلتفرم باید دوباره بخواندش مهر و موم می‌شود، و انبارهایی که پیش از این ساختار ساخته شده‌اند در حال انتقال به آن‌اند، نه اینکه به حال خود رها شوند.

    internal/secretbox

خروج ترافیک

هیچ چیز از دل نشانی‌ای که شما تنظیم کرده‌اید بیرون نمی‌رود.

مقصد یک وب‌هوک ذاتاً ورودی‌ای است که مهاجم می‌تواند بر آن اثر بگذارد — نشانی‌ای است که یک فضای کاری تایپ می‌کند و پلتفرم بعد آن را از درون شبکهٔ خودش فراخوانی می‌کند.

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

internal/outbox/ssrf.go · internal/outbox/dispatcher.go

حضانت دارایی

ما امین دارایی نیستیم، و کد از تبدیل‌شدن به آن سر باز می‌زند.

نه وجوه اعضا. نه کلید خصوصی. نه اعتبارنامهٔ پلتفرم درون مسیر پرداخت یک فضای کاری.

اعضا به شما پرداخت می‌کنند

هر مسیر پرداخت با اعتبارنامهٔ خودِ فضای کاری و روی حساب‌های خودِ آن پیکربندی می‌شود.

internal/rails

پیکربندی، مالِ ما را رد می‌کند

ذخیرهٔ اعتبارنامه‌ای که با اعتبارنامهٔ خودِ پلتفرم یکی باشد رد می‌شود. این بررسی وجود دارد چون «فعلاً از مال خودمان استفاده کنیم» همان راهی است که یک شرکت نرم‌افزاری سهواً به مؤسسهٔ پرداخت تبدیل می‌شود.

internal/rails

برداشت دستور می‌دهد، پول را جابه‌جا نمی‌کند

یک درخواست برداشت دقیقاً همان سطرهای دفتر کل را رزرو می‌کند و یک دستور بیرون می‌دهد. اجرا با شماست، و پولی هم که روی آن اجرا می‌شود مال شماست.

internal/claims

هویت

احراز هویت بدون نگه‌داشتن مدرک.

نشست ارائه‌دهنده روی حساب خودِ شما اجرا می‌شود. آنچه برمی‌گردد یک تصمیم است و یک شناسهٔ برگشت‌ناپذیر.

این شناسه فقط برای اعمال قاعدهٔ «یک نفر، یک جایگاه» کافی است و نه بیشتر. برای بازسازی یک هویت کافی نیست، و نکته دقیقاً همین است: امن‌ترین راه نگهداری اسکن گذرنامه، نگه‌نداشتن آن است، و یک نشت نمی‌تواند داده‌ای را افشا کند که هرگز ذخیره نشده.

internal/verification

آنچه ادعا نمی‌کنیم

چیزهایی که ادعایش را نداریم.

اگر دارید پرسشنامهٔ ارزیابی تأمین‌کننده را پر می‌کنید، این‌ها سطرهایی‌اند که در آن‌ها رد می‌شویم. بهتر است اینجا بدانید تا در ماه چهارم.

گزارش SOC 2 نداریم. هیچ تست نفوذ شخص ثالثی انجام نشده است. هیچ تعهدی دربارهٔ در دسترس بودن سرویس منتشر نمی‌کنیم، چون هنوز چیزی اینجا آن را اندازه نمی‌گیرد. XEX به شما کنترل و سابقه می‌دهد؛ مجوز نمی‌دهد و مشاورهٔ حقوقی هم نیست. اینکه طرح پاداش شما در کشوری که در آن بازاریابی می‌کنید قانونی باشد، اثباتش با خودتان است و شرایط پلتفرم ما شما را به همین ملزم می‌کند.
افشای آسیب‌پذیری
امروز برنامهٔ جایزهٔ باگ نداریم و بابت گزارش پولی پرداخت نمی‌شود. آسیب‌پذیری را از مسیر امنیتی صفحهٔ تماس گزارش کنید؛ دریافتش را تأیید می‌کنیم و می‌گوییم چه کار می‌کنیم. لطفاً روی فضای کاری یک مشتری زنده تست نکنید — یک محیط آزمایشی رایگان بردارید که همان محصول کامل است و آنجا تست کنید.

See /contact#security

قدم بعد

پرسشنامه را بفرستید، یا یک محیط آزمایشی بردارید و خودتان ببینید.

هر دو خوب است. یکی‌شان سریع‌تر است.