회사를 나온 뒤로 한국 생활 정보를 영어로 쓰는 사이트를 하나 굴리고 있다. 매일 기사 한 편이 사람 손 없이 올라가야 하는 곳이라, 주제를 고르고 출처를 확인하고 게이트를 통과하면 발행하는 일을 스킬 하나에 맡겨 놨다. 15시 26분에 그 스킬을 돌렸고, 기사는 한 편도 안 올라갔다. 전날에는 작업 디렉터리 경계에 막혀 첫 명령부터 승인 요구가 뜬 적이 있었다.
무엇이 멈췄나
첫 단계는 주제 후보를 뽑는 스크립트를 돌리는 것이다. 그게 이렇게 돌아왔다.
This Bash command contains multiple operations. The following part
requires approval: node scripts/pick-topic.mjs 2>&1
친 명령은 node scripts/pick-topic.mjs 2>&1 | head -60이었다. 앞 60줄만 보려고 파이프를 붙였고, 나는 그게 컨텍스트를 아끼는 예의 바른 쪽이라고 생각하고 있었다.
파이프 탓인 줄 알았다
메시지가 친절해서 읽기는 쉬웠다. multiple operations — 파이프로 이어 붙인 한 줄이 여러 개로 세어졌고, 그중 승인이 필요한 조각이 하나 있다는 말이다. 그러면 파이프를 빼면 된다.
빼고 다시 쳤다. node scripts/pick-topic.mjs. 이번엔 This command requires approval 한 줄이 나왔다.
파이프가 아니었다. head -60을 떼고 다시 쳐도 같은 자리에서 막혔는데, 파이프가 그 위에 “여러 개로 쪼개졌다”는 한 겹을 덮는 바람에 나는 애꿎은 데를 먼저 고치고 있었다. 같은 세션에서 검색도, 출처 기사를 가져오는 것도, git diff --stat PROGRESS.md 한 줄도 전부 같은 식으로 거부당했다.
조각 두 개로 경계를 재봤다
밤에 같은 폴더에서 세션을 새로 두 개 열었다. 한 세션에 명령 한 줄씩, 그 줄 말고는 아무것도 시키지 않았다.
node -e "console.log(6*7)" # This command requires approval
npm run queue 2>&1 # 막힘 기록 없음위는 파일도 네트워크도 안 건드리는 산수 한 줄인데 승인을 요구했다. 아래는 2>&1이 붙은 채로 막힘 기록이 없다. 위험해 보이는 순서와 막히는 순서가 서로 어긋난다.
그래서 이렇게 읽었다. 판정은 이 명령이 무엇을 하는지가 아니라 명령 이름이 목록에 있는지를 본다. npm run은 있고 node -e는 없다. 리다이렉트가 붙었는데도 통과한 건 그래서고, 6 곱하기 7이 막힌 것도 그래서다. 두 관측에서 나온 해석이라 더 좁은 조건에서 틀릴 수 있다 — 반례를 만나면 그때 고친다.
다음
무인 실행이 승인에서 멈췄다면, 로그에 찍힌 명령을 통째로 다시 치지 말고 파이프 앞 조각만 떼어 한 번 더 쳐보세요. 두 번째도 막히면 허용 목록에 그 조각이 없는 것이고, 통과하면 파이프가 만든 조각 중 하나가 걸린 것입니다.
허용 목록을 손보는 건 내일 할 일로 남겼다. 그 전에 이 사이트의 진행 문서(PROGRESS.md)를 고쳤다. 이 계열의 문제는 폴더 신뢰 기록이 없어 권한 목록이 통째로 무시됐던 경우까지 거슬러 올라간다.