دسکتاپ، Worker و محاسبات محلی · فصل ۱ — Device Identity، Tauri، Tray و Admin CLI · 176
Tauri Capabilities و CSP
اپ یا worker محلی را اجرا میکند اما device identity، privilege، offline state و fleet behavior را طراحی نکرده است. موضوع جاری: «Tauri Capabilities و CSP». میتواند «Tauri Capabilities و CSP» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
خلاصهٔ درس
اپ یا worker محلی را اجرا میکند اما device identity، privilege، offline state و fleet behavior را طراحی نکرده است. موضوع جاری: «Tauri Capabilities و CSP».
میتواند «Tauri Capabilities و CSP» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
خروجی این درس
میتواند «Tauri Capabilities و CSP» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
1. مسئله: «امن به نظر رسیدن» با Least Privilege یکی نیست
در یک Desktop App ممکن است CSP بسیار محدود باشد اما همان WebView از طریق Capability به Native permissionهای بیش از نیاز دسترسی داشته باشد. برعکس، ممکن است Capability کوچک باشد ولی CSP اجازهی بارگذاری Script یا اتصال شبکهای بسیار گسترده بدهد. این درس این دو محور را جدا میکند تا هیچکدام پوششِ مصنوعی برای ضعف دیگری نسازد.
2. مرز مالکیت LOC-003
LOC-003 فقط قرارداد Exposure بین Window/WebView، Capability، Permission/Scope و CSP را مالک است. پیادهسازی و Authorization خود Native Command متعلق به LOC-002 است؛ Tray و Degraded runtime UX در LOC-004 است. خروجی این درس یک Tauri Capability/CSP Least-Privilege Matrix v1 است، نه سیستم کامل Authorization اپلیکیشن.
3. Capability در Tauri چه چیزی را کنترل میکند؟
در Tauri v2، Capability مشخص میکند کدام Permissionها برای کدام Window یا WebView مجاز یا ممنوعاند. پس سؤال درست این نیست که «اپ این Permission را دارد؟»؛ باید بپرسیم «این Window/WebView دقیقاً از طریق چه Capabilityهایی و با چه Scopeهایی به آن دسترسی پیدا کرده است؟»
4. عضویت چندگانه یعنی Effective Exposure را باید Merge کنید
یک Window/WebView میتواند در بیش از یک Capability حضور داشته باشد. مستندات Tauri هشدار میدهد که در این حالت مرزهای امنیتی و Permissionهای آن Capabilityها عملاً با هم merge میشوند. بنابراین بررسی هر فایل Capability بهتنهایی کافی نیست؛ باید Effective Capability Set همان WebView را محاسبه کنید.
5. Permission و Scope را از Capability ID جدا ثبت کنید
اسم Capability بهتنهایی Evidence نیست. Matrix باید Permissionهای مؤثر، allow_scope و deny_scope را نشان دهد. اگر مثلاً WebView فقط نیاز به خواندن یک Status محدود دارد، Permission یا Scope فایلسیستمِ wildcard حتی با نامی مثل default یا safe قابل توجیه نیست.
6. Capability نقش کاربر انسانی نیست
Capability نباید بهجای Role یا Identity انسانی استفاده شود. اینکه Window در Capability خاصی قرار گرفته فقط Exposure فنی Frontend به Native API را توضیح میدهد؛ ثابت نمیکند چه کاربری پشت آن Window است یا Domain Authorization برای یک Action برقرار است.
7. CSP محور دیگری است: WebView چه چیزی را میتواند بارگذاری یا به آن وصل شود؟
Tauri، CSP را برای محدودکردن Resource loading در HTML/WebView مستند میکند. Directiveهایی مثل script-src، connect-src و img-src تعیین میکنند چه Sourceهایی مجازند. این لایه باید تا حد عملی محدود باشد و فقط Originها و منابع واقعاً لازم را باز کند.
8. Remote content یک Exception عادی نیست
مستندات رسمی Tauri هشدار میدهد که Script یا Content راهدور میتواند Attack Vector اضافه کند. پس اضافهکردن CDN، https: گسترده یا wildcard در connect-src فقط برای راحتی Debug نباید بدون Justification وارد Release شود. هر Origin خارجی باید دقیقاً به Use case مالکشده وصل باشد.
9. CSP و Native Permission یکدیگر را خنثی نمیکنند
CSP قوی، Native permission وسیع را امن نمیکند؛ Capability محدود هم CSP باز را بیخطر نمیکند. Matrix باید دو ستون مستقل داشته باشد: Native Exposure و Web Content/Origin Exposure. Release تنها وقتی PASS است که هر دو محور به حداقل نیاز واقعی رسیده باشند.
10. Merge Risk را صریح محاسبه کنید
اگر یک WebView هم diagnostics-read و هم admin-control را match کند، Exposure مؤثر Union هر دو است—even اگر هر Capability بهتنهایی منطقی باشد. merge_risk باید نشان دهد آیا عضویت همزمان Permission حساسی را ناخواسته وارد Use case کرده است یا نه.
11. Release Blocker باید دلیل مشخص داشته باشد
یک Gate خوب فقط BLOCK نمیگوید. دلیل را تایپ میکند: CAPABILITY_OVERLAP, NATIVE_SCOPE_TOO_BROAD, CSP_ORIGIN_TOO_BROAD, UNKNOWN_CAPABILITY, یا PLATFORM_MISMATCH. این Reason بعداً مشخص میکند Repair روی کدام محور انجام شود.
12. مثال شکست: CSP سخت + Native wildcard هنوز Fail است
فرض کنید default-src 'self' و connect-src 'self' کاملاً محدود هستند، اما Capability همان WebView Permission نوشتن روی مسیر wildcard را دارد. این Configuration نباید PASS شود؛ Web Exposure خوب است ولی Native Exposure هنوز بیش از Use case است.
13. مثال شکست دوم: Native محدود + CSP باز هم Fail است
حالا Native permission فقط Read-only status است، اما script-src https: و connect-src * باقی ماندهاند. این بار Native Axis خوب است ولی Web Axis بیش از حد باز است. نتیجه باز هم BLOCK است، اما Reason باید متفاوت باشد تا Repair اشتباه انجام نشود.
14. Lab: Tauri Capability/CSP Least-Privilege Matrix v1
هشت Fixture مصنوعی دارید. برای هر Fixture باید effective_capability_set، effective_permissions، native_exposure، csp_exposure، merge_risk، release_blocker، decision و reason را استخراج کنید. Expected mapping در Learner package وجود ندارد. Lab هیچ Tauri process واقعی، Network request، Credential یا تغییر OS اجرا نمیکند.
15. Transfer: Diagnostics WebView بدون ارثبری Admin
یک Diagnostics WebView جدید فقط به یک Command خواندنی و یک API Origin نیاز دارد. آن را در Capability مستقل نگه دارید، overlap با restart/credential/admin را حذف کنید و connect-src را فقط به همان Origin لازم محدود کنید. اگر برای راحتی آن را به Capability اصلی یا CSP وسیع وصل کنید، Transfer شکست خورده است—even اگر Baseline قبلی PASS بوده باشد.
ارزیابی
پاسخنامهی این درس در بستهی آموزش وجود ندارد؛ خودت جواب بده و صادقانه علامت بزن. «نیاز به مرور» درس را به صف تکرار میفرستد.
LOC-003-Q1 boundary
LOC-003-Q2 negative
LOC-003-Q3 negative
LOC-003-Q4 transfer
ملاکهای ارزیابی (rubric)
- Boundary: distinguishes native capability/permission scope from CSP resource/origin scope.
- Effective exposure: calculates merged capability membership rather than reviewing files in isolation.
- Least privilege: blocks broad native scope and broad CSP independently.
- Typed uncertainty: preserves unknown capability and platform mismatch states.
- Transfer: rebuilds diagnostics webview without inheriting restart/credential/admin permissions and without widening CSP.
منابع و تازگی
مطالعهٔ موارد (case studies)
فایلهای آزمایشگاه
Implement evaluate_case(case) in starter.py. Use only the supplied synthetic fixture. Return exactly these fields: effective_capability_set, effective_permissions, native_exposure, csp_exposure, merge_risk, release_blocker, decision, reason.
Do not perform network calls, invoke Tauri, touch OS permissions, or guess hidden answer outputs. Preserve unknown capability and platform mismatch states rather than coercing them to PASS.