카나리도 찾지 못한 시크릿 스캐너의 버그
배송
판매할 모든 키트를 압축하기 전에 게이트가 자체 시크릿의 실제 값을 스캔합니다. 모든 스캔은 종류별 카나리를 심는 것부터 시작하며, 모두 잡아내지 못하면 실행을 거부합니다. 카나리는 항상 잡혔습니다. 하지만 버그는 있었습니다.
게이트가 시크릿을 읽는 방법
게이트는 키 모양인 것만 찾지 않습니다. 시크릿이 저장된 파일(env 파일, JSON 설정, 키 파일)을 읽고, 이름이 시크릿임을 나타내는 모든 값을 추출한 뒤, 출시할 대상에서 해당 값들을 원본과 base64 인코딩 상태로 검색합니다.
버그
다음과 같은 줄의 경우:
DB_PASSWORD='Tr0ub4dor-and-3' # 5월에 교체됨
리더는 값이 따옴표 문자로 시작하고 끝날 때만 주변 따옴표를 제거했습니다. 값 뒤에 주석이 있으면 줄이 문자로 끝나므로 따옴표가 남습니다. 주석은 그다음에 잘려 나갔고, 게이트는 따옴표를 포함한 'Tr0ub4dor-and-3'을 검색했습니다. 따옴표 없이 비밀번호가 포함된 키트는 통과했을 것입니다.
카나리가 왜 알아채지 못했는가
카나리는 네트를 테스트합니다. 스캐너가 이미 아는 값을 심고, 그것이 발견되는지 확인합니다. 카나리 값은 스캐너에 직접 전달되었으므로 설정 줄을 읽는 코드를 거치지 않았습니다. 모든 네트는 테스트되었지만, 그 앞의 파서는 테스트되지 않았습니다.
발견 경위
게이트를 독립적인 제품으로 만드는 중이었으며, 사람들이 실제로 작성하는 형식(export, 따옴표, 후행 주석)의 설정 파일을 입력하는 테스트를 작성했습니다. 주석이 있는 따옴표 처리 줄에서 테스트가 실패했습니다. 수정 사항은 따옴표가 있는 값을 닫는 따옴표까지 읽고 그 뒤에 오는 것은 무시하도록 합니다.
실제 영향이 있었는가?
무엇을 변경하기 전에 확인했습니다. 빌드 머신에서 게이트는 지정된 59개 파일에서 133개의 시크릿 값을 읽고, 두 번째 머신에서는 499개를 읽습니다. 그 형식을 가진 것은 하나도 없었습니다. 이전 판정에는 변화가 없습니다. 출시된 모든 키트는 지금과 동일한 값으로 스캔되었습니다. 그래도 세 머신 모두에서 게이트를 수정했습니다.
핵심 요약
스캐너가 검색 대상 항목을 추출한다면, 심어 놓은 값으로 검색만 테스트하지 말고 실제 입력값으로 추출을 테스트해야 합니다. 카나리 테스트는 그물이 작동한다는 것을 증명할 뿐, 올바른 대상이 그물에 걸리는지는 알 수 없습니다. Secret Gate의 테스트는 이제 두 가지를 모두 다루며, 출시 전에 빌드 게이트와 동일한 133개 값을 정확히 읽는지 확인했습니다.