"URL 은 path, file, url, 자격증명, Recall base URL, 임의의 플레이어 인자를 절대 안 담아야 해."
은퇴한 적 없는 45살 버그
1988년에 Norm Hardy 가 이런 컴파일러를 얘기했어. 보호된 시스템 파일에 청구 기록을 쓸 수 있고, 동시에 사용자한테 출력 파일 이름도 정하게 하는 컴파일러. 영리한 사용자가 청구 파일을 자기 출력으로 지정했고, 컴파일러는 자기 권한으로 신나게 그걸 덮어썼어. 컴파일러가 악의적인 건 아니었어. 혼란에 빠진 거지. 사용자한테 없는 힘을 가졌으면서, 사용자 입력이 그 힘을 사용자가 고른 타겟에 겨누게 뒀거든. 그게 confused deputy 고, 어디에나 있어.
Ashen Reel 은 대리인이야
cwkashenreel:// 링크를 누가 만들 수 있는지 생각해봐. Recall 이 만들 수 있지. 근데 웹 페이지도, 이메일도, 채팅 메시지도 만들어. macOS 앞에 URL 을 내밀 수 있는 건 뭐든. 그리고 Ashen Reel 은 네 파일 접근으로 돌아가. 네가 읽을 수 있는 건 뭐든 읽지. 이 두 사실이 합쳐진 게 위험 전부야. 링크가 경로를 실을 수 있으면, 적대적 웹 페이지가 cwkashenreel://recall/open?path=/Users/you/Documents/tax-return.pdf 를 만들고, 신뢰된 대리인인 Ashen Reel 이 그 페이지엔 만질 권리도 없는 파일을, 페이지엔 없는 권한으로 열어버려.
고침은 필터가 아니라 구조야
경로 필드를 sanitize 하려 들 수 있어. .. 막고, 절대 경로 막고, 디렉토리 allowlist 하고. 근데 그 길은 멀고, 역사는 한 수 놓친 path-sanitizer 들의 무덤이야. Ashen Reel 은 대신 구조로 고쳐. 호출자가 경로를 아예 못 이름 붙이게. video_id 를 이름 붙이면, Ashen Reel 이 그 id 를 Recall 자기 신뢰된 데이터베이스에서 해석해. 호출자는 이미 있고 이미 허용된 영상만 가리킬 수 있어. 요청자가 더는 타겟을 못 고르니까 대리인이 혼란에 안 빠지고.
공격이랑 그게 부딪히는 벽을 봐.