æ²çå坿§è¡ä»£ç 代ç | AIçæåç¿»è¯
é®é¢ï¼å¦æä»£çè½å¤æ§è¡ Python/shell èæ¬ï¼èèæ¬å¯ä»¥è½»æç»è¿æä»¶è®¿é®éå¶ï¼æä»¬è¯¥å¦ä½æ£ç¡®å°å¯¹ä»£çè¿è¡æ²ç®±é离ï¼
åçï¼
ä½ æåºäºæ ¸å¿çéé¸è·¯å¾ââ妿åºå±æ§è¡å¨å¯ä»¥è¿è¡ä»»æä»£ç ï¼é£ä¹å¨ä»£çç¼æå±è®¾ç½®ç鲿¤æªæ½å°±åªæ¯å®å ¨å§åºãå®é æ åµå¦ä¸ï¼
é®é¢æå¨
# 代çè¯å¾éµå®âç¦æ¢ rm -rf /âç鲿¤è§å
# ä½ä»¥ä¸æ¹å¼å§ç»ææï¼
agent.execute("python3 << 'EOF'\nimport subprocess\nsubprocess.run(['rm', '-rf', '/'])\nEOF")
ä»£çæ æ³â黿¢âèæ¬æ§è¡ä»»ä½æä½ââå®åªæ¯ä¸ä¸ªè§£éå¨ãçæ£çæ²ç®±é离éè¦æ§è¡ç¯å¢é离ï¼èéç¼æå±çè§åã
容å¨é离ï¼å¿ éçåºç¡ï¼
没éï¼å®¹å¨ç¡®å®æ¯çæ¡ãä½å®ä»¬å¹¶éä¸è½ââå®ä»¬åªæ¯æä¾äºï¼
- æä»¶ç³»ç»é离ââ容å¨å
ç
rmåªä¼å é¤å®¹å¨æ ¹ç®å½ - ç½ç»é离ââå¯éå¶ä¸ºä» å 许å表ä¸çå°å
- èµæºéå¶ââéè¿ cgroups 设置 CPU/å å/ç£çé é¢
- UID é离ââé»è®¤ä»¥éç¹æç¨æ·èº«ä»½è¿è¡ä»£ç
å®é å®ç°ç¤ºä¾ï¼
# ä»£çæ§è¡å¨ç伪代ç
docker run --rm \
--cpus 2 \
--memory 2g \
--read-only \
--tmpfs /tmp:size=1g \
--network none \
--user 1000:1000 \
python:3.11 python /script.py
容卿 æ³é»æ¢çå¨è
- ä¾§ä¿¡éæ»å»ââå¯éè¿æ¶é´ãç¼åè¡ä¸ºãéè½ä¿¡éæ³é²æ°æ®
- å æ ¸æ¼æ´å©ç¨ââéè¿å æ ¸ CVE è¿è¡å®¹å¨éé¸
- èµæºèå°½ââfork ç¸å¼¹ãæ é循ç¯ï¼å°½ç®¡ cgroups ææå¸®å©ï¼
- æéæåââ妿å¨å®¹å¨å 以 root 身份è¿è¡
å®é éç¨çæ¹æ¡
Claude Codeï¼åç±»ä¼¼å·¥å ·ï¼ä½¿ç¨ï¼
- æ¯ä¸ªä¼è¯å¯¹åºä¸ä¸ªå®¹å¨ï¼é离ç代ç ç¯å¢ï¼
- ä» å 许å表ä¸çç½ç»ï¼æ æ³å°æ°æ®å¤æ³å°ä»»æ URLï¼
- èµæºéå¶å è¶ æ¶ç»æ¢
- æä»¶ç³»ç»é é¢
- ç¨æ·æ¨¡å¼æ§è¡ï¼æ ç¹æï¼
LLM API æä¾åï¼OpenAIãAnthropic çï¼ï¼
- 临æ¶èææºææ²ç®±ï¼æ¯å®¹å¨æ´å¼ºçé离ï¼
- ç¦ç¨ root/sudo
- ç½ç»ä» éäºç¹å®æå¡
- æ§è¡è¶ æ¶ï¼ç»æ¢å¤±æ§è¿ç¨ï¼
- è¾åºæ¸ çï¼è¿åç»ä»£çåå¥ç¦»æºå¯ä¿¡æ¯ï¼
è¶ è¶å®¹å¨ï¼åºäºè½åçå®å ¨
è¦å®ç°æ´ä¸¥æ ¼çæ§å¶ï¼ä»âé»è®¤æç»âè½¬åæ¾å¼è½åï¼
class SandboxedPython:
def __init__(self, allowed_modules=None):
self.allowed = allowed_modules or {'numpy', 'pandas', 'json'}
def execute(self, code):
# éæåæï¼è§£æ ASTï¼æç»æªå¨å
许å表ä¸ç导å
¥
tree = ast.parse(code)
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
if alias.name not in self.allowed:
raise SecurityError(f"模å {alias.name} ä¸å
许")
# å¨åéçå
ç½®å½æ°ä¸æ§è¡
exec(code, {'__builtins__': RestrictedBuiltins()})
ä½è¿å¾èå¼±ââä½ æ»æ¯ç¦»ç»è¿å¤±è´¥åªå·®ä¸æ¥ï¼åå°ãpickle çï¼ã
æ®é ·çç°å®
å个è¿ç¨å ä¸åå¨å®ç¾çæ²ç®±ã ä½ çéæ©æ¯ä¸ä¸ªå è°±ï¼
éå¯¹ä½ ç使ç¨åºæ¯
å¦æä½ å¨æå»ºä¸ä¸ªä»£çç³»ç»ï¼
- 容å¨åºç¡ââ对äºä¸å¯ä¿¡ä»£ç æ¯ä¸å¯å¦¥åç
- ç½ç»é离ââ黿¢ææé¤ç½åå端ç¹ä¹å¤çè¿æ¥
- èµæºéå¶ââCPU/å å/æ¶é´é é¢å¯é²æ¢æç»æå¡
- è¶ æ¶å¼ºå¶æ§è¡ââç»æ¢ä»»ä½è¿è¡è¶ è¿ N ç§çè¿ç¨
- è¾åºæ¸ çââå¨è¿åç»ç¨æ·ä¹åï¼ç¨æ£å表达å¼/LLM æ«ææ³é²çæºå¯ä¿¡æ¯
- æ¥å¿è®°å½ââå®¡è®¡æææ§è¡çå½ä»¤ï¼ç¨äºåçå®å ¨äºä»¶åçåè¯ï¼
# ä»£çæ§è¡å¨çå®é
åºç¡é
ç½®
docker run --rm \
--cpus 1 --memory 512m --storage-opt size=100m \
--network restricted-net \
--tmpfs /tmp:noexec,size=500m \
--cap-drop ALL \
--read-only --workdir /tmp \
--user agent:agent \
--timeout 30s \
python:3.11-slim python /tmp/code.py
å ³é®è¦ç¹ï¼ä½ 䏿¯å¨è¯å¾é»æ¢ä¸ä¸ªåå®çæ»å»è ââä½ æ¯å¨è¯å¾é²æ¢æå¤å¹¶éå¶å½±åèå´ã ä¸ä¸ªè¶³å¤èªæç对æå¯ä»¥éé¸å¤§å¤æ°æ²ç®±ãä½å®¹å¨å èµæºéå¶å¯ä»¥é»æ¢ 95% çæå¤æå®³å大夿°çå®ä¸ççæ»å»ã
æ£æ¥ä¸ä¸ä½ å ³äºç³»ç»å®å ¨/容å¨éé¸çç¬è®°ï¼å¦æä½ åè¿ç¸å ³å 容ââå¾å¥½å¥ä½ æ¯å¦å·²ç»æ¢ç´¢è¿ DeepSeek ä»£çæ²ç®±æç±»ä¼¼æ¹æ¡ã
