← 뉴스레터

2026-08-01

메모에 백틱을 쓰면 그 안이 실행된다

작업 기록에 메모를 붙이는 명령이 있다. 메모 안에 개발 명령어를 인용해 적었더니, 그 명령이 진짜로 실행됐다.

인용했는데 실행됐다

작업 하나하나에 메모를 붙여 둔다. “이건 이래서 막혔다”, “이 명령으로 확인했다” 같은 것들이다. 메모를 붙이는 전용 명령이 있고, 거기에 문장을 넘긴다.

어느 날 메모에 개발 명령어를 하나 인용해 적었다. 백틱으로 감싼 채로.

그 명령이 실행됐다. 다행히 아무것도 망가뜨리지 않는 종류였다.

문장이 셸을 두 번 지나가고 있었다

원인은 메모 본문이 명령 해석기를 두 번 통과하고 있었다는 것이다.

한 번은 명령을 실행할 때. 여기까지는 정상이다. 문제는 그 안에서 본문을 다시 조립하면서 한 번 더 해석했다는 점이다. 그래서 본문에 백틱이나 달러 기호가 있으면, 그 안쪽이 명령으로 읽혔다.

인용부호로 감싸는 걸로는 안 막힌다. 감싸는 건 한 겹을 막을 뿐이고, 두 겹이면 뚫린다.

수리는 해석기를 안 지나가게 만드는 것

고치는 방향이 두 갈래였다.

하나는 인용을 더 촘촘히 하는 것. 이건 임시방편이다. 다음에 층이 하나 더 생기면 또 뚫린다.

다른 하나는 본문이 해석기를 아예 안 지나가게 만드는 것. 이쪽을 골랐다. 메모를 파일로 넘기거나 표준입력으로 밀어 넣는 경로를 새로 만들었고, 본문을 다시 조립하던 층을 걷어냈다.

21:40  fix(sot): sot-mark 노트에 셸 비경유 입력 경로 신설
       — --note-file / stdin

이제 메모에 무엇을 쓰든 그건 데이터다. 백틱을 쓰든 달러를 쓰든 그냥 글자로 남는다.

덤으로 잡힌 것

같은 자리를 파다가 하나 더 나왔다. 작업 기록 한 줄에 메모가 계속 덧붙으면서 그 줄이 무한히 길어지고 있었다. 상한이 없었다. 몇 주 쌓인 항목은 한 줄이 화면 수십 개 분량이 됐다.

긴 메모는 별도 보관함으로 옮기고 본문에는 요약만 남기게 바꿨다. 원문은 손실 없이 그대로 보관된다.

배운 것

사람이 자유롭게 쓰는 텍스트가 명령 해석기를 지나가면, 그건 입력이 아니라 실행 가능한 코드다. 이건 웹에서는 20년 전에 정리된 교훈인데, 내부 도구에서는 여전히 새로 나온다. 밖에서 들어오는 입력만 위험하다고 생각하기 때문이다. 내가 나한테 쓰는 메모도 똑같이 위험하다.

그리고 인용부호로 막는 건 수리가 아니라 유예다. 진짜 수리는 해석기를 한 겹 걷어내는 것이다. 겹이 하나 줄면 그 겹에서 나올 수 있던 사고 전부가 같이 사라진다.


내가 나한테 남긴 메모가 나를 실행시켰다.

— 강대종 / @ssamssae