재현성은 공급망의 속성이다. 동일한 선언된 입력은 동일한 산출물을 만들어야 한다. VPN 클라이언트에서 이 문장은 내려받은 설치 프로그램을 누구나 다시 빌드할 수 있는 소스 및 도구 체인에 묶지만, 클라이언트가 연결하는 서비스에 대해서는 아무것도 말하지 않는다.

따라서 유용한 질문은 좁고 답할 수 있다. 프로젝트가 절차를 공개하는가, 그리고 당신의 특정 산출물이 그에 맞는가?

빌드가 결정적이기를 멈추는 지점

컴파일러는 지시하지 않으면 타임스탬프, 절대 경로, 빌드 호스트 이름을 넣는다. 아카이브는 파일 순서와 수정 시간을 기록하고, 링커는 도구 체인 버전에 따라 출력을 바꾸며, 병렬 압축은 블록을 재배열할 수 있다. 그중 하나만으로도 같은 소스의 두 빌드는 불길한 일 없이 바이트 단위로 달라진다. 결정성은 빌드에 설계로 넣는 것이며, 기본값으로 물려받는 것이 아니다.

재현성을 주장하는 프로젝트는 적용하는 정규화, 곧 고정 타임스탬프, 매핑된 경로, 정렬된 아카이브 항목, 고정된 컴파일러 및 의존성 버전을 밝혀야 한다. 그 목록이 없으면 정당한 변동의 공간이 정의되지 않으므로 불일치를 해석할 수 없다.

선언된 입력도 완전해야 한다. 태그 없는 저장소 URL은 리비전이 아니고, 해시 없는 잠금 파일은 의존성 집합이 아니며, 런타임에 도구를 내려받는 빌드 스크립트에는 누구도 고정할 수 없는 입력이 있다. 모든 틈은 나중에 차이가 된다. 불완전한 목록은 의미 있는 방식으로 실패할 수 없으므로, 무엇이든 비교하기 전에 목록을 완성하라.

InputHow it driftsWhat pins it
SourceBranch moves after releaseCommit hash in the build metadata
ToolchainCompiler patch level differsContainer image digest
PackagingArchive order and mtimes varyNormalised archive settings

비교가 실제로 검사하는 것

독립된 당사자가 선언된 환경에서 재빌드하고 출력을 공개된 산출물과 비교한다. 비트 단위 일치가 강한 형태이고, 기록된 차이를 뒤집으면 결과가 일치하는 문서화된 정규화 단계는 더 약하지만 여전히 유용한 형태다.

비교는 바이너리에 관한 것이고, 서명은 다른 질문에 답한다. 릴리스와 키를, 키와 신원을 연결하며, 프로젝트는 아무도 재빌드하지 않은 산출물에 유효한 서명을 가질 수 있다. 두 검사는 서로를 대체하지 않고 겹쳐 쌓인다.

sha256sum wireguard-installer.msi
gpg --verify wireguard-installer.msi.sig wireguard-installer.msi

설치 전에 둘 다 실행하고, 같은 릴리스와 플랫폼에 대해 공개된 해시와 비교하라. 공급업체 페이지와 일치하는 해시는 다운로드가 온전히 도착했음을 증명하고, 공급업체가 공개한 해시와 일치하는 재빌드 바이너리는 그것이 어떻게 만들어졌는지에 대해 더 강한 것을 증명한다.

불일치가 변조의 증거가 아닌 이유

대부분의 불일치는 아무도 통제하지 않은 입력에서 온다. 다른 컴파일러 패치 릴리스, 디버그 심볼로 새어 나간 빌드 경로, 정렬 순서를 바꾼 로캘, 또는 비교 후에 적용된 패키징 단계는 모두 정직한 작업과 다른 해시를 만든다.

그래서 불일치는 이야기가 되기 전에 문서화된 절차에 비추어 읽어야 한다. 절차가 모든 것을 고정하는데도 차이가 설명되지 않는다면, 그것은 프로젝트에 제기할 가치가 있는 실제 발견이다. 절차가 패키징에 대해 침묵한다면, 그 차이는 전적으로 예상된 것일 수 있다.

여기서는 대칭성도 중요하다: 일치는 소스에 결함이 없음을 증명하지 않는다, 다만 바이너리가 그에 대응함을 증명한다. 잘 감사된 코드와 재현 가능한 코드는 다른 속성이며, 프로젝트는 하나를 다른 하나 없이 가질 수 있다.

주장이 앱 뒤의 서비스에 대해 말하는 것

클라이언트는 당신의 기기에 있는 프로그램이고, 서비스는 다른 곳에 있는 서버, 계정 시스템, 보존 정책이다. 재현성은 전자를 제약하고 후자에 대해서는, 설치 프로그램이 아무리 주의 깊게 검증되어도 아무것도 말하지 않는다.

엔드포인트 구성은 설치 후에도, 원격 설정이나 공급자가 제어하는 프로필을 통해 바뀔 수 있다. 그런 변경은 네트워크로 도착하며 연결 전에 계산한 어떤 해시에도 포함되지 않는다.

주장을 실제 범위에서 읽고, 그다음 공급자가 무엇을 기록하며 어떤 관할권에서 요청에 답하는가라는 인접한 질문을 따로 확인하라. 검증된 바이너리와 검증되지 않은 서비스는 공존할 수 있으며, 바로 그것이 공급망 검사가 고치기 위해서가 아니라 드러내기 위해 설계된 사례다.

관련 글