터널은 작동했고 인터페이스는 올라왔으며 세션은 일주일 동안 안정적이었다. 그러나 그 무엇도 설치 프로그램을 누가 만들었는지는 알려주지 않는다. VPN 클라이언트는 경로를 다시 쓰고 자격 증명을 읽을 만큼 충분한 권한으로 실행되므로, 게시자는 각주가 아니라 위협 모델의 일부다.

점검은 순서대로 수행하고 처음 실패하는 지점에서 멈춰라. 비용이 적게 들고, 각각 다른 틈을 막는다.

첫 번째 단계: 프로젝트가 지정한 경로에서 내려받아라

모든 프로젝트는 릴리스가 어디에 있는지 문서화하며, 그 페이지가 기준이다. 커뮤니티 빌드, 스토어 등록, 공급업체 포털은 모두 정당한 경로다. 각각은 프로젝트 자체가 그것을 가리킬 때만 정당하다. 그것이 시험이며, 공식적으로 보이는 것과는 다르다.

프로젝트 이름을 붙인 파일은 아무것도 증명하지 않는다. 설치 프로그램의 이름을 바꾸는 것은 몇 초면 되는 작업이며, 검색 결과가 가장 먼저 보여주는 것이 바로 이름이다.

두 번째 단계: 알려진 신원에 대해 서명을 검증하라

서명 검증은 좁은 질문에 잘 답한다. 특정 신원이 이 바이너리에 서명했고 그 이후 바이너리가 바뀌지 않았음을 알려준다. 한 질문에는 답하고 다른 질문은 거부한다. 그 신원이 당신이 신뢰하려던 대상인지는 알려줄 수 없다.

# macOS: who signed this app, and is the signature intact?
codesign -dv --verbose=4 /Applications/Tunnel.app
spctl -a -vvv -t install /Applications/Tunnel.app

# Windows: signature and publisher of the installer
Get-AuthenticodeSignature .\tunnel-setup.exe | Format-List Status, SignerCertificate

# Linux: detached signature from the project's release page
gpg --verify tunnel-1.4.2.tar.gz.asc tunnel-1.4.2.tar.gz

상태 단어가 아니라 신원을 읽어라. 유효한 인증서를 가진 무관한 개발자도 유효한 서명을 만든다. 인식된 게시자를 보고하는 운영체제는 누군가 인증서 비용을 냈다는 것만 말해줄 뿐이다.

세 번째 단계: 해시를 독립적인 출처와 비교하라

체크섬은 기준 값과의 일치를 증명한다. 기준 값이 다운로드 옆에 도착했다면 둘 다 함께 틀릴 수 있고 비교는 그대로 통과한다. 대부분의 자습서에서 나타나는 실패 방식이 이것이다. 해시는 그것이 설명하는 파일과 같은 페이지에 있다.

# Linux and macOS
shasum -a 256 tunnel-1.4.2.dmg

# compare against the value published on the project's own release page
# not against a value copied from the same mirror

프로젝트가 서명된 체크섬이나 서명된 릴리스 매니페스트를 게시한다면, 각 파일이 아니라 목록에 대해 서명을 검증하라. 그러면 하나의 신뢰할 수 있는 기준이 릴리스 전체를 덮는다.

설치 후: 업데이트 경로를 유지하라

지원되는 경로는 설치가 끝난 뒤에도 중요하다. 다시 패키징된 빌드는 자체 업데이터를 포함할 수 있고, 그 업데이터가 다음 달 무엇이 실행될지를 결정한다. 절대 업데이트되지 않는 빌드가 더 안전한 것은 아니다. 단지 더 오래된 것뿐이다.

클라이언트가 어떻게 업데이트되어야 하는지, 관리 시스템이 그 단계를 맡는지 기록하라. 답이 포럼에서 수동으로 내려받는 것이라면 공급망 질문은 결코 제대로 닫히지 않았다.

두 출처, 하나가 아니다

클라이언트 개발자와 프로필 발급자는 별개의 당사자다. 공식 클라이언트가 무관한 사업자의 프로필을 가져오는 것은 정상적인 구성이며, 프로필은 자체 검토를 받을 가치가 있다. 누가 발급했는지, 어떻게 전달되었는지, 서버 인증서가 기대하는 이름과 일치하는지다.

메모에 두 출처를 모두 식별 가능하게 남겨라. 클라이언트가 교체되거나 기기가 백업에서 복원되는 순간, 그 두 줄이 정체불명의 빌드나 프로필이 나머지 데이터와 함께 돌아오는 것을 막는다.

관련 글