fix(v3): T30 安全加固(Mimosa 深度扫描驱动)

- 路径参数 ID 白名单(runs/agent/sessions),杀灭 Windows 反斜杠穿越(..%5C 直读 .env)
- artifacts 端点关押 + pipeline 工件名消毒(模型输出名剥路径成分)
- /llama/download dest 关押 models/ 内 + URL 协议白名单(先于 HF 别名转换)
- GET /config architect.api_key 打码(api_key_set + 前 6 位),PUT 空串=保留
- TrustedHostMiddleware 信任围栏(GATEWAY_TRUSTED_HOSTS 可覆盖)+ __main__ 默认 127.0.0.1
- review 抽样改 CSPRNG
- 新增 tests/test_security_hardening.py(13 项,全部离线)
This commit is contained in:
tzt
2026-09-02 00:01:33 +08:00
parent ddef8bec1c
commit ce3ba44de3
6 changed files with 236 additions and 5 deletions
+10 -1
View File
@@ -25,6 +25,14 @@ from .worker import WorkerLoop
from .workspace import Workspace
def _safe_artifact_name(name: str) -> str:
"""工件名单消毒:剥路径成分,只留文件名(工件名来自模型输出,防 ../ 越界写盘)。"""
part = str(name or "").replace("\\", "/").split("/")[-1].strip()
if not part or part in (".", ".."):
return "artifact.bin"
return part[:120]
@dataclass
class PipelineResult:
"""v2 协作管线一次运行的结果。"""
@@ -289,12 +297,13 @@ class CollaborativePipeline:
def _save_artifact(self, request_id: str, name: str, text: str) -> None:
if not text:
return
name = _safe_artifact_name(name)
d = self.run_dir / request_id / "artifacts"
d.mkdir(parents=True, exist_ok=True)
(d / name).write_text(text, encoding="utf-8")
def _read_artifact(self, request_id: str, name: str) -> str:
p = self.run_dir / request_id / "artifacts" / name
p = self.run_dir / request_id / "artifacts" / _safe_artifact_name(name)
if p.exists():
return p.read_text(encoding="utf-8")
return ""
+9 -2
View File
@@ -24,6 +24,10 @@ def _now_iso() -> str:
return datetime.now(timezone.utc).isoformat(timespec="seconds")
# 抽样用系统级随机源(CSPRNG
_SYSTEM_RANDOM = random.SystemRandom()
_SCHEMA = """
CREATE TABLE IF NOT EXISTS reviews (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -69,11 +73,14 @@ class ReviewQueue:
def should_enqueue(tags: List[str], sample_rate: float = 0.10,
force_tags: Optional[List[str]] = None,
rng: Optional[random.Random] = None) -> bool:
"""是否应入队:tags 命中 force_tags 强制;否则按 sample_rate 抽样。"""
"""是否应入队:tags 命中 force_tags 强制;否则按 sample_rate 抽样。
缺省用系统级 CSPRNG(不可预测,不可被时间种子影响抽样公平性)。
"""
force = force_tags or []
if any(t in force for t in tags):
return True
rng = rng or random.Random()
rng = rng or _SYSTEM_RANDOM
return rng.random() < sample_rate
# ---------------------------------------------------------------