Repository navigation
fix(hooks): block-destructive 가 뒤에 붙은 df -h / 때문에 스크래치패드 삭제를 CATASTROPHIC 으로 막던 것 — rm 이 든 단순 명령 안에서만 봐요 - #29
Merged
Conversation
This was referenced Oct 3, 2026
…/` 로 스크래치패드 삭제가 막히던 것 CATASTROPHIC 의 세 조건(rm · 재귀 플래그 · 루트/시스템 경로)을 명령 문자열 전체에 따로 걸어서, 서로 다른 명령의 조각이 합쳐졌어요. 실측(one-tenth): 세션 스크래치패드의 20GB 빌드 캐시를 지우는 `cd <scratchpad>/ios-dd && rm -rf Build/... Logs; du -sh . ; df -h / | tail -1` 이 `df -h /` 의 ` /` 때문에 "재귀 rm + 루트/시스템 경로" 로 막혔고 디스크가 120MB 까지 찼어요. heredoc 으로 파일을 쓰는 명령도 본문 낱말로 같은 이유로 여러 번 막혔어요. - `;` `&&` `||` `|` `&` `(` `)` 백틱 줄바꿈에서 세그먼트로 자르고, 세 조건을 같은 세그먼트에서만 봐요 - 세그먼트로 가르며 생길 구멍 하나를 막아요: `cd /`·`cd ~`·`cd /usr` 뒤 `rm -rf *`/`.`/`./*` 는 CATASTROPHIC (예전엔 `cd /` 의 ` /` 에 우연히 걸렸어요). `(rm -rf ~)` 처럼 괄호에 붙은 홈 삭제도 이제 잡아요 - 상위 경로(..) 경고도 같은 범위로 — `rm -rf build && cd ..` 는 경고하지 않아요 - 스크래치패드 경로 허용 목록은 두지 않았어요. 원인이 경로가 아니라 범위였고, CATASTROPHIC 앞에 허용 목록을 두면 `.../scratchpad/../../..` 같은 표기가 새 우회로가 돼요 smoke §15 에 회귀 13종(스크래치패드 실측 명령 · 절대 경로 · /tmp/claude-* · 변수 경로 · heredoc 본문 통과, 같은 세그먼트 rm -rf / · /* · sudo /usr · (~) · cd / 뒤 * · cd ~ 뒤 . · cd /usr 뒤 ./* 차단, cd 로 벗어나면 통과), §41 에 `rm -rf build && cd ..`, §51 에 스크래치패드 통과 · 프로젝트 루트 자체 차단. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C8rZ6V3FW3nwYA9T7iygPd
… 붙여요 세그먼트를 줄바꿈에서 자르면서 `rm -rf \⏎ /` 가 두 세그먼트로 갈라져 루트 삭제가 통과했어요 (main 은 NORM 에서 줄바꿈을 공백으로 바꿔 잡고 있었어요). `pushd / && rm -rf *` 도 cd 만 보던 탓에 통과했어요. - 자르기 전에 `\` + 줄바꿈을 공백으로 붙여요 - cd 와 같이 pushd 도 다음 세그먼트의 상대 경로 기준으로 봐요 - smoke §15: pushd 1건 · 줄 이어쓰기 3건 (jq 로 JSON 을 만들어 줄바꿈을 그대로 넘겨요) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
bluecheat
force-pushed
the
fix/block-destructive-segment-scope
branch
from
October 3, 2026 14:14
3928264 to
2634073
Compare
Owner
Author
|
리뷰에서 찾은 CATASTROPHIC 우회 2건을 이 브랜치에서 고쳤어요 (c 커밋
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
무엇이 좋아지나
cd / && rm -rf *를 이제 의도적으로 잡아요원인 — 경로가 아니라 범위였어요
막힌 명령 원문:
CATASTROPHIC 의 세 조건(rm 호출 · 재귀 플래그 · 루트/시스템 경로)을 명령 문자열 전체에 따로 걸어서,
rm -rf와 무관한df -h /의/가 "루트 경로" 조건을 채웠어요. 스크래치패드 경로(/private/tmp/...)는 원래 루트 패턴에 안 맞아요.어떻게
;&&|||&()백틱 줄바꿈에서 단순 명령(세그먼트)으로 자르고, 세 조건을 같은 세그먼트 안에서만 봐요. python 없이 bash+awk 로만 해요 (CATASTROPHIC 은 끌 수 없는 층이라 의존을 늘리지 않았어요)cd한 뒤의rm -rf */././*는 CATASTROPHIC. 다른 곳으로 다시cd하면 풀려요(rm -rf ~)처럼 괄호에 붙은 홈 삭제도 이제 잡혀요 (예전엔~)라서 놓쳤어요)rm -rf build && cd ..는 경고하지 않아요스크래치패드 허용 목록은 두지 않았어요. 브리프는
/private/tmp/claude-*/**/scratchpad/**허용을 제안했지만, 범위만 고치면 스크래치패드 삭제는 이미 통과하고, CATASTROPHIC 앞에 경로 허용 목록을 두면…/scratchpad/../../..같은 표기가 새 우회로가 돼요. 스크래치패드는 프로젝트 밖이라destructive-facts도 묻지 않아요 (테스트로 고정).바뀐 파일
templates/default/.ax/hooks/pre-bash/block-destructive.shtests/smoke.sh§15 · §41 · §51검증 (빨강 → 초록)
수정 전 훅에 새 테스트만 얹었을 때 (§15.1):
§41:
✗ block-destructive — 일상 명령 'rm -rf build && cd ..' 오탐(FAILS=1)수정 후: §15 FAILS=0 (✓ 45개), §41 FAILS=0, §51
✓ destructive-facts — 스크래치패드(프로젝트 밖)는 통과 · 프로젝트 루트 자체는 차단.그대로 막는 것(회귀 고정):
rm -rf /·/*·"/"·/usr /etc·~·--recursive --force /·find / -delete·chmod -R 777 /, 그리고 새로rm -rf / ; echo done·ls && rm -rf /*·df -h / && sudo rm -rf /usr·(rm -rf ~)·cd / && rm -rf *·cd ~; rm -rf .·cd /usr && rm -rf ./*.버전·changelog 는 올리지 않았어요 — 열린 #26·#27(0.7.3)·#28(0.7.4) 이 버전을 쥐고 있고 이번에 PR 셋이 같이 열려서, 머지 순서가 정해질 때 한 번에 올리는 게 충돌이 적어요.
🤖 Generated with Claude Code
https://claude.ai/code/session_01C8rZ6V3FW3nwYA9T7iygPd