مرجع
مدل امنیتی
Row-Template چطور از سرور، مشترکان و ورودیهای برندینگ شما محافظت میکند — و چطور یک آسیبپذیری را گزارش دهید.
Row-Template با دسترسی root روی سروری اجرا میشود که پنل شما روی آن است و صفحهای ارائه میکند که اطلاعات مشترکان را نشان میدهد. طوری ساخته شده که در صورت شک متوقف شود: وقتی چیزی دقیقاً آنطور که انتظار میرود نباشد، بهجای حدس زدن متوقف میشود و دلیلش را میگوید.
دریافت نسخه
- فقط HTTPS. دانلودها با
curlانجام میشوند که روی HTTPS و TLS 1.2 یا جدیدتر قفل شده است، پس یک redirect نمیتواند اتصال را تنزل دهد. HTTP ساده به یک کلید صریح آزمایشی (RT_ALLOW_INSECURE_URL) نیاز دارد و هرگز روی منبع پیشفرض اعمال نمیشود. - SHA-256 اجباری. آرشیو نسخه باید پیش از استخراج هر چیزی با
SHA256SUMSبخواند. هیچ پرچم یا متغیری برای رد شدن از آن وجود ندارد. - دفاع لایهای. پس از استخراج، کتابخانه صفحه را با فهرست چکسام داخلی آرشیو بررسی میکند، ساختارش را اعتبارسنجی میکند، هر طرح را با چکسامش بررسی میکند و نسخهای را که فایلهای نصبکنندهاش ناقص باشد رد میکند.
- استخراج امن. مسیرهای مطلق، مسیرهای دارای
..، پیوندهای نمادین، پیوندهای سخت و فایلهای ویژه پیش از استخراج رد میشوند و آرشیو نمیتواند مالک یا مجوز فایلها را تعیین کند. - داده، نه کد. بهروزرسانی هرگز اسکریپتی را که دانلود کرده اجرا نمیکند: فقط کد مطمئنی که از قبل نصب است بهروزرسانی را انجام میدهد و آرشیو دانلودشده بهعنوان دادهٔ بررسیشده با آن رفتار میشود.
اینکه چکسام چه چیزی را ثابت میکند و چه چیزی را نه، در بررسی نسخه توضیح داده شده است.
ورودیهای شما
- برندینگ داده است. بهصورت base64 در
config.envذخیره میشود که با ابزارهای متنی ساده خوانده میشود و هرگز source یا اجرا نمیشود. مجوز این فایل640است. - اعتبارسنجی سختگیرانه. نام سرویس حداکثر ۱۲۰ نویسه و بدون نویسهٔ کنترلی است؛ لینک پشتیبانی باید از
https،http،tgیاmailtoاستفاده کند، پس لینکهایjavascript:،data:یاfile:همان ابتدا رد میشوند. - جاسازی امن. مقادیر بهصورت رشتههای escapeشدهٔ JSON در یک بلوک ثابت وارد صفحه میشوند، طوری که نتوانند اسکریپت را ببندند، و صفحه آنها را بهصورت متن قرار میدهد، هرگز بهصورت HTML. مقداری که نویسهٔ کنترلی داشته باشد، بهجای عبور، ساخت صفحه را متوقف میکند.
- لوگو بر اساس محتوا. لوگو فقط وقتی پذیرفته میشود که بایتهای ابتداییاش آن را PNG، JPEG یا WebP نشان دهند — SVG، GIF، HTML و هر چیز دیگری، نام فایل هر چه باشد، رد میشود. حجم آن حداکثر ۲۵۶ کیلوبایت است و symlink رد میشود، حتی اگر پس از بررسی جایگزین شده باشد.
تغییر فایلها
- نوشتن اتمی. هر فایل اول با نامی موقت کنار مقصدش نوشته و سپس با تغییر نام سر جایش گذاشته میشود، پس خواننده یا کل فایل قدیمی را میبیند یا کل فایل جدید را.
- اعتبارسنجی پیش از جایگزینی. صفحهٔ جدید پیش از جایگزین کردن صفحهٔ زنده ساخته و از نظر ساختاری اعتبارسنجی میشود. شکست، صفحهٔ زنده را دستنخورده میگذارد.
- بازگردانی خودکار. بهروزرسانی، تعویض تمپلیت، تغییر برندینگ و بازگردانی، اول از وضعیت فعلی عکسبرداری میکنند و اگر مرحلهٔ بعدی شکست بخورد آن را برمیگردانند. در PasarGuard و Rebecca، فعالسازی از تنظیمات پنل عکس فوری میگیرد و بازگردانی با خواندن دوبارهٔ تنظیمات و مقایسه با عکس فوری تأیید میشود — هرگز فرض نمیشود.
- بدون نوشتن از طریق symlink. Row-Template از نوشتن روی مسیری که پیوند نمادین است، یا حذف آن، خودداری میکند.
- حذف محدود. پشتیبانهای قدیمی فقط از داخل پوشهٔ پشتیبانها حذف میشوند، هرگز خود پوشه. حذفکننده اول تأیید میکند که پوشه نصب Row-Template است و مسیرهای سیستمی را قاطعانه رد میکند؛ فرمان
row-templateرا فقط وقتی حذف میکند که فایل راهانداز خود Row-Template باشد.
پنل شما
- تشخیص سختگیرانهٔ پنل. یک پنل فقط وقتی نصبشده به حساب میآید که دو نشانهٔ مستقل از آن با هم بخوانند؛ پنل نیمهنصب بهجای حدس زدن رد میشود. روی سروری با چند پنل، نصب اسکریپتی باید یکی را با
RT_PANELنام ببرد و هیچ نصبی خودبهخود به پنل دیگری نمیرود. - بررسیهای سختگیرانه. نصب روی 3X-UI پایینتر از 3.6.0 یا 3X-UIای که نسخهاش خوانده نشود انجام نمیشود، و ایمیج Docker نسخهٔ 0.0.x از Rebecca — که تنظیم را میپذیرفت و بیصدا صفحهٔ خودش را ارائه میداد — پیش از هر تغییری رد میشود.
- حدس نزدن پایگاهداده. اگر اولین پایگاهدادهٔ پیداشدهٔ 3X-UI فایل SQLite واقعی نباشد، بهجای جایگزینی با گزینهٔ دیگری که ممکن است متعلق به نصب دیگری باشد، رد میشود.
- کمترین تغییر. در 3X-UI فقط
subThemeDirنوشته میشود، با سرویس متوقف و با خواندن دوبارهٔ نتیجه. در PasarGuard یک بلوک نشاندار به.envاضافه میشود و هیچکدام از خطوط شما ویرایش نمیشود؛ حذف،.envرا دقیقاً به بایتهای قبلیاش برمیگرداند. در Rebecca دو فیلد از تنظیمات اشتراک تنظیم و هنگام حذف دقیقاً بازگردانده میشوند. - escape شدن هر مقدار. موتور قالب PasarGuard بهطور پیشفرض مقادیر را escape نمیکند، پس هر صفحهٔ Row-Template برای PasarGuard و Rebecca بدنهاش را در یک بلوک autoescape صریح قرار میدهد: نام کاربری یا توضیح یک لینک هرگز نمیتواند markup تزریق کند.
- بدون اطلاعات محرمانه در خروجی. در 3X-UI بررسیهای زنده، شناسهٔ اشتراک یک کلاینت را برای ساختن درخواست آزمایشی محلی میخوانند؛ این شناسه هرگز چاپ، ثبت یا ذخیره نمیشود. در PasarGuard و Rebecca هیچ اشتراکی جستوجو نمیشود. فایل
.envپنل PasarGuard — که رمز ادمین، کلید JWT و نشانی پایگاهداده را دارد — فقط برای دو کلید صفحه خوانده میشود، هرگز چاپ و هرگز در پشتیبان کپی نمیشود، و هیچ رمز پایگاهدادهٔ Rebecca هرگز پرسیده، خوانده یا چاپ نمیشود. صفحهٔ اطلاعات در منوی مدیریت فقط نشان میدهد لینک پشتیبانی تنظیم شده یا نه، نه خود لینک را.
صفحهٔ ارائهشده
- هیچ درخواستی به سرویسهای دیگر ندارد؛ همه چیز داخل یک فایل است.
- لینکهای مشترک در Configuration Explorer تا باز شدن پوشیده میمانند و هرگز در کنسول نوشته نمیشوند.
- از موتورهای جستوجو میخواهد آن را فهرست نکنند و ارجاعدهنده نمیفرستد.
- بهروزرسانی زنده فقط پاسخی را میپذیرد که به همان شکلی باشد که صفحه از آن پنل انتظار دارد — فیلدهای خود صفحه در 3X-UI، و رکورد حساب کاربر در PasarGuard و Rebecca — و با هر چیز دیگری متوقف میشود.
- لینک Import یک برنامهٔ PasarGuard نمیتواند نشانی
javascript:،data:،file:یا مشابه آن باشد و لینک دانلودش باید نشانی وب باشد؛ آیکون آن هرگز بارگذاری نمیشود.
گزارش آسیبپذیری
لطفاً مشکلات امنیتی را بهصورت خصوصی گزارش دهید، نه در یک issue عمومی. در مخزن، Security → Report a vulnerability را باز کنید و نسخهٔ آسیبدیده (row-template version)، پنل شما و نسخهٔ آن، سیستمعامل و مراحل دقیق بازتولید را بنویسید. اصلاحیههای امنیتی برای آخرین نسخهٔ پایدار منتشر میشوند.
اگر گزارش خصوصی برایتان در دسترس نیست، یک issue عمومی حداقلی باز کنید و از نگهدارنده بخواهید آن را فعال کند — بدون هیچ جزئیاتی از آسیبپذیری.