fix(hook): find ask 게이트 우회와 tail 순열 미탐지를 고친다 - #362
Merged
Conversation
리뷰가 낸 여섯 건 중 실측으로 사실이 확인된 셋만 고친다. "critical" 로 매겨진 os.defpath 가 CWD 를 먼저 뒤진다는 지적은 거짓이었다 - Python 3.9/3.12/3.13/3.14 모두 '/bin:/usr/bin' 이고 선행 콜론이 없다. ./bash 를 심고 실제로 확인했다. git grep/blame 이 --no-textconv 를 거부한다는 지적도 거짓이다. 셋 다 수용한다. - find ask 게이트가 토큰 접합으로 뚫렸다. shlex 는 따옴표 밖의 `;` 를 단어에 붙여 두므로 `find . -delete;true` 가 `-delete;true` 한 토큰이 되어 정확 일치를 빗나갔고, 이어서 MiniShell 이 `;` 를 거부해 통과시켰다. 문자 다섯 개로 제품에 남은 유일한 사용자 브레이크가 사라졌다. 구분자를 떼어낸 조각으로도 본다. 이 게이트의 취지가 파싱 성공 여부와 무관하게 되돌릴 수 없는 삭제를 사람에게 묻는 것이므로 여기가 맞는 자리다. 구분자에 공백류는 넣지 않는다. 처음에 개행까지 넣었더니 `find . $\<개행>'-exec' …` 가 ask 로 바뀌었는데, bash 는 그 줄 연결을 지워 `$-exec` 로 읽으므로 실제로는 -exec 를 실행하지 않는다. 없는 위험을 묻게 되는 오탐이었고 기존 테스트가 잡았다. - tail 옵션 순열을 보지 못했다. GNU tail 은 옵션을 순열하는데 _head_tail_is_safe 는 첫 위치인자에서 훑기를 멈춰 `tail a.log -f` 를 안전으로 판정했다. 래핑된 follower 는 끝나지 않아 워치독까지 턴이 멈춘다. 같은 함정을 이 파일은 sed 와 shortlog 에서 이미 고쳤고 head/tail 만 빠져 있었다. `--` 뒤는 피연산자이므로 `tail -- -f` 의 -f 는 파일 이름으로 두고, `-fn 20` 같은 묶음 옵션도 본다. - is_already_wrapped 가 항상 False 였다. classify_incoming_wrapper 가 한 번도 돌려주지 않는 "exact" 를 확인하고 있었다. 유일한 호출자가 assertFalse 라 그 사실이 드러나지 않았다. 분류기가 봉투로 인정한 것을 인정하게 하고, True 가 되어야 하는 입력을 테스트에 함께 고정해 다시 죽으면 실패하게 했다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZWGDQsVTLjsBogUSrmnzH
Bash 훅의 find ask 게이트·tail 순열·죽은 헬퍼 수정이 다시 B2 의 rewrite_bash_for_token_budget.py 와 그 미러를 바꾼다. gen17 이후와 같은 이유로 freeze 가 실제 blocker 이고, 같은 이유로 경로 집합을 좁히지 않는다. 지문은 생산 canonicalizer 로 계산했다. 기존 레코드와 지문은 건드리지 않았다. 세대 목록 핀과 narrowed_paths_report 기대값을 gen21 까지 늘린다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZWGDQsVTLjsBogUSrmnzH
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Team Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Merged
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.
Bash 훅(3,304줄)과 편집 정책 두 파일을
--effort max적대적 리뷰에 보낸 결과다. 리뷰가 낸 여섯 건을 전부 실측했고 사실인 셋만 고친다.거짓으로 확인된 지적
리뷰가 critical 로 매긴 것이 거짓이었다.
선행 콜론이 없다.
./env./bash./git을 실제로 심고 확인했지만 전부/usr/bin·/bin으로 해석된다. 이 전제 위에 얹힌 S4.1(git 경로 문제)도 함께 무너진다.git grep/git blame이--no-textconv를 거부할 것이라는 지적도 거짓이다. 셋 다 수용한다(blame 은 파일을 줘야 제대로 판별된다).고친 것
1. find ask 게이트가 토큰 접합으로 뚫렸다
shlex 는 따옴표 밖의
;를 단어에 붙여 두므로-delete;true가 한 토큰이 되어 정확 일치를 빗나갔고, 이어서 MiniShell 이;를 거부해 decline → 원본 그대로 실행됐다. 설계 주석은 이 게이트가 "파싱과 무관하게" 잡는다고 적어 두었지만 실제로는 구분자 의존적이었다. 문자 다섯 개로 제품에 남은 유일한 사용자 브레이크가 사라진다.구분자를 떼어낸 조각으로도 본다. 공백류는 구분자에 넣지 않는다 — 처음에 개행까지 넣었더니
find . $\<개행>'-exec' …가 ask 로 바뀌었는데, bash 는 그 줄 연결을 지워$-exec로 읽으므로 실제로는-exec를 실행하지 않는다. 없는 위험을 묻게 되는 오탐이었고 기존 테스트가 잡았다.2. tail 옵션 순열을 보지 못했다
GNU tail 은 옵션을 순열하는데
_head_tail_is_safe는 첫 위치인자에서 훑기를 멈춘다. 래핑된 follower 는 끝나지 않아 600초 워치독까지 턴이 멈춘다. 같은 함정을 이 파일은 sed 와 shortlog 에서 이미 고쳤다(주석에 "GNU sed 는 옵션을 순열한다"고 적혀 있다). head/tail 만 빠져 있었다.--뒤는 피연산자이므로tail -- -f의-f는 파일 이름으로 두고,-fn 20같은 묶음 옵션도 본다.3.
is_already_wrapped가 항상 False 였다classify_incoming_wrapper가 한 번도 돌려주지 않는"exact"를 확인하고 있었다. 그 함수는None,"incoming_wrapper_denied","nested_wrapper_denied"만 반환한다. 유일한 호출자가assertFalse라 그 사실이 드러나지 않았다.판단하지 못한 것
리뷰의 S5(재귀 가드 우회)는 호스트 허용목록 동작에 달려 있어 이 패킷만으로 판단할 수 없다. 리뷰도 그렇게 밝혔다. 다만 가드가 자기 주석이 말하는 불변식보다 좁은 부분집합만 강제하는 것은 코드에서 확인된다. 별도 조사가 필요하다.
Gate-B gen21
다시 B2 의
rewrite_bash_for_token_budget.py와 미러를 바꾸므로 gen17 이후와 같은 절차를 따른다. 경로 집합은 좁히지 않는다. 네 커밋 왕복 후 최종 트리가 원래와 동일함을 확인했고, 지문은 생산 canonicalizer 로 계산했다.증거
tests.test_context_guard_shell_contract93건,tests.test_gate_b_rollback_proof73건 통과. 신규 회귀 테스트 5건 — 접합 형태 ask, 삭제처럼 보이는 무해한 명령은 ask 아님, follow 옵션 위치 무관 비래핑, 정상 head/tail 은 계속 래핑,is_already_wrapped의 True/False 양쪽.🤖 Generated with Claude Code
https://claude.ai/code/session_01YZWGDQsVTLjsBogUSrmnzH