본문으로 이동

스마트 컨트랙트 감사 보고서 읽는 법

스마트 컨트랙트 감사는 지정된 코드, 빌드, 배포, 가정과 속성을 대상으로 하는 제한적 검토이며, 발견 사항과 수정 내용을 실제 운영 시스템과 대조해야 합니다.

업데이트

교육 목적의 참고 자료일 뿐 투자 또는 보안 자문이 아닙니다. 감사 보고서, 도구 결과, 해결된 발견 사항 또는 일치하는 소스 파일은 인증, 보험, 보상이나 실제 배포가 안전하다는 증명이 아닙니다.

핵심 답변

스마트 컨트랙트 감사는 명시된 기간 동안 지정된 요구사항, 소스 코드, 빌드 입력, 배포 로직과 보안 가정을 조사하는 제한적 검토입니다. 감사자는 서로 보완하는 방법으로 결함을 찾고, 악용 경로를 입증하고, 영향을 평가하며, 제안된 수정 사항을 확인합니다. 결론은 보고서에 기술된 감사 시점의 스냅샷과 증거에만 적용됩니다.

스냅샷은 저장소와 커밋 또는 트리 해시, 서브모듈과 의존성 잠금, 컴파일러와 설정, 생성 코드, 배포 스크립트, 대상 체인과 주소, 프록시, 구현체 또는 비콘, 생성자 또는 초기화 데이터, 라이브러리, 관리자, 타임락과 특정 블록 또는 시점을 고정해야 합니다. 명시적 제외 항목은 포함 항목만큼 중요합니다. 프런트엔드, keeper, 오라클, 브리지, 거버넌스 절차 또는 오프체인 서명자가 감사 범위 밖이더라도 위험을 좌우할 수 있습니다.

감사에는 위협 모델과 명세가 필요합니다. 자산, 행위자, 특권 역할, 신뢰 경계, 공격자 역량, 순서와 재구성 가정, 외부 의존성, 상태 전이, 정확한 안전성과 라이브니스 속성을 식별해야 합니다. 단위, 전제조건, 한정자와 예외가 없는 불변식은 잘못된 동작을 완벽하게 증명하거나 시험할 수 있습니다.

네 가지 원장을 사용합니다. 범위·빌드·배포 동일성 원장, 요구사항·위협·불변식 원장, 발견 사항·증거·재시험 원장, 잔여 위험·수용·공개 원장입니다. critical 발견 사항이 없는 보고서는 보안 인증서가 아니며, resolved 표시가 배포 완료를 뜻하지 않습니다. 증명도 인코딩된 속성, 모델과 가정만 다룹니다.

작동 방식

수동 검토는 아키텍처, 자금 흐름, 함수 간 상태와 경제적 의도를 추적합니다. 정적 분석은 패턴과 데이터 흐름을 찾지만 거짓 양성과 거짓 음성을 낼 수 있습니다. 단위, 통합, 포크와 차등 테스트는 구체적 동작을 비교합니다. 상태 기반 퍼징과 불변식 테스트는 생성된 호출 순서를 탐색하지만 결과는 핸들러, 셀렉터, 시드, 코퍼스, 실행 횟수, 깊이와 모델링된 환경에 좌우됩니다.

기호 실행과 정형 검증은 지원되는 의미론과 가정 아래 선택된 어설션을 확립할 수 있습니다. 솔버의 unknown, 시간 초과 또는 미지원 동작은 증명이 아닙니다. 증명된 속성도 오라클 경제성, 거버넌스, 배포 설정, 체인 동작이나 팀이 실제 의도한 요구사항을 빠뜨릴 수 있습니다. 명세와 해석은 사람이 검토해야 하며 AI가 생성한 관찰은 별도의 보증 방법이 아닙니다.

각 발견 사항에는 영향받는 산출물과 배포, 전제조건, 최소 증명, 악용 경로, 도달 가능성, 필요한 권한, 공격 자본, 반복 가능성, 경제적 영향, 심각도 기준과 권고를 기록해야 합니다. 악용 가능성 또는 발생 가능성과 영향은 별개의 축입니다. 이론적 최댓값, 취약점 이름 또는 도구 라벨만으로 실행 가능한 손실이 입증되지는 않습니다.

open, acknowledged, risk accepted, partially fixed, resolved, retested 같은 상태는 보편적 표준이 아닙니다. 근거 있는 종결은 원래 문제를 정확한 수정 커밋에 연결하고, 변경 경로와 인접 경로의 시험 내용을 기록하며, 누가 언제 무엇을 재시험했는지 밝혀야 합니다. 수용한 위험도 여전히 위험이며, 제한적 재시험이 원래 범위를 모든 신규 코드로 확장하지는 않습니다.

업그레이드 가능한 배포는 별도 대조가 필요합니다. 프록시, 구현체 또는 비콘과 관리자 슬롯을 확인하고, 초기화·재초기화 동작, 구현체 잠금, 스토리지 호환성, 업그레이드 권한, 타임락 또는 긴급 우회, 마이그레이션과 롤백을 검증합니다. 감사한 빌드에서 생성 바이트코드와 런타임 바이트코드를 재현한 뒤 각 체인의 연결된 라이브러리, 매개변수, 역할과 초기화 상태를 비교합니다.

최종 보고서에는 개정판, 감사자와 날짜, 정확한 범위, 방법과 설정, 한계, 발견 사항, 증거, 수정 상태, 미해결 또는 수용된 위험과 공개 조건이 있어야 합니다. 출시 후에는 구현체 해시, 역할, 매개변수, 의존성과 사고를 모니터링합니다. 중대한 변경은 새 차이 검토를 요구하며, 예전 보고서의 배지가 향후 코드에 자동으로 따라가지는 않습니다.

다음 절차를 사용합니다.

  1. 감사 매니페스트를 고정합니다. 저장소, 커밋, 의존성, 컴파일러와 설정, 생성 코드와 배포 코드, 체인, 주소, 프록시 구성, 매개변수, 블록, 보고서 개정판, 포함 및 제외 항목을 기록합니다.
  2. 자산, 행위자, 특권 역할, 신뢰 경계, 공격자 역량, 수명주기, 순서와 라이브니스 가정, 외부 의존성, 측정 가능한 불변식을 정의합니다.
  3. 빌드를 재현하고 아키텍처, 스토리지, 데이터, 자금과 제어를 매핑합니다. 소스, 산출물, 라이브러리, 생성·런타임 바이트코드, 초기화, 역할과 실제 배포를 대조합니다.
  4. 수동, 정적, 단위, 통합, 포크, 차등, 퍼징, 불변식, 기호 또는 정형 방법을 조합하고 도구 버전, 설정, 시드, 코퍼스, 커버리지, 시간 초과와 미확정 결과를 기록합니다.
  5. 각 문제의 대상 산출물, 전제조건, 증명, 악용 가능성, 영향, 심각도 방법, 배포 노출, 권고와 비공개 증거를 기록하고 도구 라벨을 판단으로 취급하지 않습니다.
  6. 수정 커밋을 고정하고 문제, 인접 경로와 불변식을 재시험합니다. 프록시 스토리지, 초기화, 마이그레이션, 롤백, 재현 가능한 빌드와 배포 영수증을 검증한 다음 증거에 근거한 상태를 부여합니다.
  7. 범위, 방법, 한계와 잔여 위험을 공개하고 감사 산출물을 운영 중인 각 체인과 대조합니다. 시스템 변화에 맞춰 모니터링, 공개, 사고 대응과 버그 바운티 통제를 계속 갱신합니다.

예시

  • 볼트 인플레이션 경로에는 완전한 원장이 필요합니다. 공격자가 최초 예치 분기를 통해 1 asset을 예치하고 1 share를 받은 다음 1,000,000 assets을 기부하면 총계는 1,000,001 assets1 share가 됩니다. 피해자가 500,000 assets을 예치하고 안전하지 않은 내림 계산을 적용하면 floor(500,000 * 1 / 1,000,001) = 0 shares가 됩니다. 0 지분 예치를 허용하면 볼트는 1,500,001 assets을 보유하며, 공격자는 전액을 상환받아 500,000 assets을 더 얻습니다. 공격자의 기여분은 1,000,001-asset입니다. 구현체가 0 지분에서 리버트하면 이 손실 경로는 실행되지 않습니다.
  • 파일 커버리지는 배포 커버리지가 아닙니다. 매니페스트에 24 source units, 4 deployment scripts, 3 keeper services, 총 31 items이 있습니다. 감사에는 20 source units2 scripts가 포함되므로 항목 수 커버리지는 22 / 31 = 70.96774194%이고 나머지 9 items은 제외됩니다. 운영 프록시가 제외된 단위로 빌드한 구현체를 가리킨다면 그 운영 구현체의 커버리지는 0%입니다. 이는 제목에 표시된 70.96774194%와 다른 측정치입니다.
  • 퍼징 관찰은 부재 증명이 아닙니다. 상태 기반 실행에서 2,000 sequences * 64 calls = 128,000 calls를 수행하고 불변식이 3 sequences에서 실패하면 생성된 순서의 관찰 비율은 3 / 2,000 = 0.15%입니다. 수정 후 10,000 sequences * 64 calls = 640,000 calls에서 실패가 0이어도 이 코퍼스에서 0이라는 뜻일 뿐 증명이 아닙니다. 독립성과 안정적인 생성기를 전제하는 교육용 가정에서 삼의 법칙에 따른 근사 95% 상한은 생성 순서당 3 / 10,000 = 0.03%입니다.
  • 발견 사항 종결과 배포 동일성은 독립적입니다. 보고서에는 12 findings, 즉 2 critical, 3 high, 4 medium, 3 low가 있습니다. 재시험으로 2 + 2 + 3 + 2 = 9건이 종결되어 건수 종결률은 9 / 12 = 75%이지만 high, medium, low가 하나씩 남습니다. 감사한 런타임 해시는 H1, 운영 구현체는 H2이므로 종결률과 무관하게 배포 검증은 실패합니다. 정확한 H1로 교체하고 프록시 슬롯, 초기화와 역할이 일치해도 검증한 블록 시점의 동일성만 입증합니다.

위험

  • 저장소, 커밋, 서브모듈 또는 생성 소스가 오래되었거나 모호합니다.
  • 컴파일러 버전, 최적화 설정, 라이브러리 또는 의존성이 고정되지 않았습니다.
  • 배포 스크립트, 생성자 데이터, 초기화 또는 CREATE2 salt가 제외되었습니다.
  • 잘못된 체인, 주소, 프록시, 비콘 또는 구현체를 조사합니다.
  • 소스, 산출물, 생성 바이트코드와 런타임 바이트코드를 대조할 수 없습니다.
  • 위협 모델이 행위자, 권한, 자산 또는 신뢰 경계를 빠뜨립니다.
  • 명세 또는 불변식의 단위, 전제조건 또는 예외가 잘못되었습니다.
  • 관리자, 가디언, 타임락, 일시정지, 업그레이드 또는 마이그레이션 경로를 놓칩니다.
  • 오라클, 토큰, 브리지, keeper, 거버넌스 또는 체인 가정이 무너집니다.
  • 정적 분석의 거짓 양성이 검토되지 않은 채 남습니다.
  • 수동 검토, 테스트 또는 퍼징이 생성되지 않은 경로를 놓칩니다.
  • 퍼징 하네스, 셀렉터, 시드, 코퍼스, 깊이 또는 상태 모델이 편향됩니다.
  • 솔버 시간 초과, 미지원 의미론 또는 unknown을 증명으로 오인합니다.
  • 올바른 증명이 잘못된 요구사항이나 불완전한 시스템을 정형화합니다.
  • 악용 가능성과 영향이 아니라 취약점 이름으로 심각도를 정합니다.
  • 이론적 위험 금액을 도달 가능한 손실 또는 공격자 이익으로 오인합니다.
  • 수정이 인접 회귀를 만들거나 경제적 불변식을 깨뜨립니다.
  • 프록시 스토리지, 초기화, 업그레이드 또는 마이그레이션이 운영 상태를 손상합니다.
  • 수용, 미해결 또는 부분 수정된 문제가 감사 통과 배지에 가려집니다.
  • 보고서를 보험, 인증, 보상 또는 영구적인 보장 범위로 취급합니다.

흔한 오해

  • “중대한 발견 사항이 없으면 컨트랙트는 안전하다.” 제한된 범위, 기간과 방법에서 보고된 발견 사항을 뜻할 뿐 가능한 모든 결함을 부정하지 않습니다.
  • “높은 테스트 커버리지나 퍼징 실패 0건은 버그가 없다는 증명이다.” 선택한 코드와 생성 경로의 측정치일 뿐 부재 증명이 아닙니다.
  • “정형 검증은 프로토콜 전체의 안전성을 증명한다.” 가정 아래 모델에 인코딩된 속성을 증명할 뿐, 명세와 주변 시스템은 여전히 잘못될 수 있습니다.
  • “해결됨은 모든 운영 배포가 수정되었다는 뜻이다.” 종결에는 독립적 재시험과 각 배포의 빌드, 바이트코드, 프록시, 매개변수, 역할 대조가 필요합니다.
  • “평판 좋은 감사 회사는 보상이나 향후 업그레이드를 보장한다.” 책임은 감사 계약에 따라 달라지고 사용자가 수익자가 아닐 수 있으며, 이후 코드나 설정은 이전 스냅샷 범위 밖입니다.

관련 주제

출처

탐색

위키 검색...