本章是審計員、資安研究者、企業資安長的主要閱讀章。我們以 STRIDE 威脅模型逐項盤點 PIF AI 的攻擊面,對每項威脅給出緩解措施,並對應到 OWASP Top 10(2021)。最後說明 i18n 5 語系於資安上的特殊考量(super-admin 不套用)。
STRIDE1(Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege)為 PIF AI 採用的威脅分類法。
優先保護資產:
| 資產 | 機敏性 | 影響 |
|---|---|---|
| 配方(INCI + 濃度) | 極高 | 商業機密外洩 → 法律訴訟 |
| SA 簽章 | 極高 | 偽造 → 法規責任 + 刑事偽造文書 |
| 使用者憑證 | 高 | 身份竊取 → 全面資料洩漏 |
| 毒理摘要 | 中 | 僅公開資料庫整理,影響有限 |
| 系統組態 | 高 | 影響所有租戶可用性 |
| 威脅類型 | 代表攻擊 | 緩解 |
|---|---|---|
| Spoofing | 冒充其他使用者 | JWT 短效 + Refresh + 裝置指紋(規劃) |
| Tampering | 篡改請求 / 稽核 | HTTPS 全站 + audit log 不可篡改 |
| Repudiation | 否認 SA 簽章 | SA 需 TOTP + 電子簽章記錄 + IP + UA 於 audit |
| Information disclosure | 配方外洩 | 四層隔離(§10)+ AES-256 + 稽核觸發警報 |
| Denial of service | 密集 AI 呼叫 | Rate limit + Cloudflare + fail-soft 降級 |
| Elevation of privilege | 一般使用者成 super admin | DB CHECK constraint on role + super-admin 需另建 user record(非升級) |
PIF AI 採雙重機制:
| Token | 存活期 | 存放 | 用途 |
|---|---|---|---|
| Access Token | 15 分鐘 | Memory(不入 localStorage) | API 授權 |
| Refresh Token | 7 天 | HttpOnly Cookie | 換發 Access |
| Session cookie(NextAuth) | 24 小時 | HttpOnly + Secure | 前端 Session |
Access token 短效使被盜用時間窗口縮短;refresh token 設於 HttpOnly Cookie 避免 XSS 竊取。
SA 為高敏感角色。任何 sa_review.* 端點呼叫前皆需通過 TOTP(Google Authenticator / Authy 皆相容),實作:
# app/core/security.py (概念)
def verify_totp(user: User, code: str) -> bool:
if not user.totp_enabled:
return True # 尚未啟用 TOTP 的使用者(非 SA)
totp = pyotp.TOTP(user.totp_secret)
return totp.verify(code, valid_window=1)
DB 欄位 users.totp_secret 以 application-level encryption 存儲,即使 DB 被 dump 也不易還原。
Super admin(Baiyuan Tech 內部維運)是 PIF 最高權限。設計上隔離:
/super-admin/loginpifai_superadmin)取得 BYPASSRLS 權限max-age=31536000; includeSubDomains; preload如 §8.5 所述,配方檔案採應用層 AES-256-GCM + S3 SSE-KMS:
# app/services/encryption.py (概念)
def encrypt_formula(plaintext: bytes, key: bytes) -> EncryptedPayload:
nonce = os.urandom(12)
aes = Cipher(algorithms.AES(key), modes.GCM(nonce)).encryptor()
ciphertext = aes.update(plaintext) + aes.finalize()
return EncryptedPayload(
nonce=nonce,
ciphertext=ciphertext,
tag=aes.tag,
)
金鑰 FILE_ENCRYPTION_KEY 長 256-bit,由 Secret Manager(AWS Secrets Manager / HashiCorp Vault)管理,不進 git、不進 env file 明文(透過 IAM role 或 service token 動態載入)。
敏感欄位於 application 層加密後才寫入:
| 欄位 | 加密方式 | 理由 |
|---|---|---|
users.totp_secret |
Fernet(對稱) | 2FA 種子 |
users.sa_certificate_url |
Fernet | SA 資格證明連結 |
organizations.api_keys |
Fernet | 第三方服務金鑰(如 ECHA) |
詳見 §8.4。對安全關鍵操作補充:
| 事件 | 觸發位置 |
|---|---|
auth.login_success / auth.login_failed |
app/api/v1/auth.py |
auth.totp_failed |
TOTP 驗證錯誤 |
org.data_export |
組織資料下載 |
admin.bypass_rls |
Super admin 使用 BYPASSRLS |
security.suspicious_login |
異常 IP 或失敗次數過多 |
以下事件觸發即時通知(Slack / PagerDuty):
auth.login_failed 連續 5 次(同 user 或 IP)admin.bypass_rls (任何時候)rag_client 連續 5 次失敗(外部服務異常)PIF AI 前端支援 5 語系(zh-TW / en / ja / ko / fr)。但 /super-admin/* 路徑刻意不引入 useI18n()。安全理由:
此為設計決策,於 CLAUDE.md 與 memory/project_pif_i18n.md 明確記錄。
5 語系 JSON 的專業翻譯由 Claude Code 協同產出(非機翻),但仍有安全要求:
{t("key")} 而非直接 HTML,避免 XSSdangerouslySetInnerHTML 渲染翻譯| OWASP Risk | PIF AI 對應 |
|---|---|
| A01 Broken Access Control | 四層隔離(§10.3.3) |
| A02 Cryptographic Failures | AES-256 雙層 + TLS 1.3 + Fernet DB |
| A03 Injection | SQLAlchemy ORM + Pydantic 驗證 + zod 前端 |
| A04 Insecure Design | 威脅模型主導設計;fail-soft 為原則 |
| A05 Security Misconfiguration | Docker image 經 trivy scan;生產環境無 DEBUG |
| A06 Vulnerable Components | dependabot + renovate 自動更新 |
| A07 ID & Auth Failures | JWT 短效 + TOTP + rate limit |
| A08 Software & Data Integrity | audit log 不可篡改 + hash chain |
| A09 Logging & Monitoring | 結構化日誌 + 即時警報 |
| A10 SSRF | 外部 API 白名單(只 allow PubChem/ECHA/RAG) |
Phase 2+ 規劃:
| 版本 | 日期 | 摘要 |
|---|---|---|
| v0.1 | 2026-04-19 | 首次撰寫。涵蓋 STRIDE、認證、加密、稽核、i18n 安全、OWASP 對應 |
© 2026 Baiyuan Tech. Licensed under CC BY-NC 4.0.
導覽 ← 第 10 章:中心 RAG · 第 12 章:路線圖、部署與開源策略 →
Microsoft. The STRIDE Threat Model. https://learn.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats ↩