본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

흔적을 안 남기는 읽기

~13 min · guardrails, evidence, verification, incident

Level 0젖은 흙
0 XP0/38 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

모든 사후 검사를 부수는 비대칭

쓰기랑 읽기는 대칭 쌍처럼 느껴지는데, 강제라는 목적에선 전혀 안 닮았어. 쓰기는 차이를 남겨. 게이트가 트리를 이전 상태랑 비교해서 파일이 안 바뀌었다고 확신할 수 있어. 읽기는 게이트가 닿을 수 있는 자리엔 아무것도 안 남겨. 차이도, 믿을 만한 시각도, 트리 안의 산출물도 없어. 운영체제는 파일 열기를 전부 기록하게 계측할 수 있어. 그건 진짜로 있는 수단이고, 이 작업장 밖에 있어. 게이트가 가진 건 저장소뿐이야. 금지된 파일을 읽은 세션의 결과물이랑 안 읽은 세션의 결과물은 구조적으로 같은 종류의 물건이야.

그러니까 "원어 파일이 하나도 수정되지 않았다"를 증명하는 게이트는 참이고, 싸고, 쓸모 있고 — 사람들이 실제로 궁금해하는 질문, 그러니까 저자가 봤느냐에 대해선 완전히 침묵해. 한동안 그 게이트가 둘 다 답하는 것처럼 취급됐어. 아니고, 그렇다고 믿은 게 문제를 계속 굴러가게 한 거야.

사건 셋, 원인 하나

이틀 동안 이 작업장에서 서로 다른 실행 셋이 같은 봉인을 깼어. 서로 다른 집필 시스템 둘, 서로 다른 작업 묶음 둘에 걸쳐서.

첫 번째는 콜드 리뷰어가 방향을 잡으려고 대상 디렉터리 목록을 봤고, 그 목록이 금지된 파일 이름을 출력했어. 두 번째는 리뷰 도중 너무 넓게 잡은 검색이 금지된 파일의 제목을 드러냈고. 세 번째는 유출 문자열을 찾던 스윕이 디렉터리 전체에 범위 없는 검색을 돌려서, 금지된 짝의 산문 필드 하나를 통째로 작업 맥락에 찍어버렸어.

셋 중 어느 것도 고의로 열어본 게 아냐. 셋 중 어느 것도 파일 열기 도구 호출이 아니었고. 전부 예외 없이, 짝을 배제할 만큼 좁은 필터 없이 디렉터리를 겨눈 셸 명령이었어. 그리고 그 실행들 전부 쓰기 차이 게이트를 초록으로 통과했어. 아무것도 안 썼으니까.

세 번이면 빠진 가드야

한 번은 사고야. 두 번은 메모할 값어치가 있는 패턴이고. 독립된 행위자 둘, 작업 묶음 둘에 걸친 세 번은 구조적 발견이야. 규칙은 정확했고, 이해됐고, 그걸 쥔 사람이 강제할 수 없었어. 위반이 기본 동작이 친절하게 넓은 도구를 통해 벌어지니까.

위반한 명령들이 얼마나 평범한지 봐. 아무도 무모해서 위험한 버전을 치는 게 아냐. 그게 답이 나오는 버전이라서 치는 거고, 안전하게 만들어줄 필터는 눈앞의 작업이 기억할 이유를 하나도 안 주는 선택 깃발이거든.

쓰기에 대한 초록 게이트는 읽기 금지가 지켜졌다는 증거가 절대 못 돼. 그 증거를 댈 수 있는 건 둘뿐이야. 저자가 분명히 말하는 것, 그리고 도구 호출 앞에 앉은 가드. 첫 번째는 어차피 요구할 값어치가 있고, 두 번째가 다음 강의 주제야.

Code

위반하는 명령, 안 하는 명령, 그리고 구별 못 하는 게이트·bash
# BREACHES - and looks completely reasonable while doing it
grep -rn "someString" ./target-dir/
ls -R ./target-dir/                    # filenames alone are a leak
cat ./target-dir/**/*                  # the obvious one
rg "someString" ./target-dir | head    # a pipe does not narrow it

# SAFE - the filter is the entire difference
rg --glob '*.target.json' "someString" ./target-dir/

# THE GATE, afterwards
git diff --stat -- './target-dir/**/*.source.json'
#   (empty)
#
# This output is TRUE and PROVES ONLY that nothing was written.
# All four breaching commands above leave it exactly this empty.
# Reading leaves no trace, so no command you can run after the
# fact will ever distinguish the clean run from the contaminated
# one. The check has to move to BEFORE the call.

External links

Exercise

네 절차에서 뭘 요구하는 대신 금지하는 규칙을 나열해봐. 각각에 대해, 금지된 행위가 뒤에 뭘 남길지 적어. 그리고 흔적을 남기는 것과 안 남기는 것 두 무더기로 나눠. 두 번째 무더기는 검사를 아무리 많이 갖고 있어도 지금 희망으로 강제되고 있는 거고, 각각 호출 지점의 가드나 기록에 남기는 명시적 확인 진술 중 하나가 필요해.
Hint
읽기, 클립보드 복사, 대시보드 보기, 동료한테 묻기. 이 넷이 흔적 없는 무더기에 제일 자주 떨어져. 삭제는 흥미로운 경계 사례야. 이미 뭔가 지켜보고 있었을 때만 흔적을 남기거든.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.