스마트 컨트랙트는 수천억 달러 규모의 가치를 관리하고 있지만, 이를 작성하는 데 사용되는 프로그래밍 언어는 대부분의 사람들에게 이해하기 어려운 것이 현실입니다. 대표적인 스마트 컨트랙트 언어인 솔리디티(Solidity) 역시 사용된 지 10년이 채 되지 않은 비교적 새로운 언어입니다. 이러한 특성으로 인해 코드의 안전성을 명확히 검증하는 것이 무엇보다 중요해졌으며, 스마트 컨트랙트의 보안을 입증하기 위한 보안 감사에 대한 수요는 지속적으로 증가하고 있습니다.
현재까지 CertiK은 3,600개 이상의 기업과 협력해 66,000건 이상의 블록체인 코드 취약점을 탐지하고, 3,600억 달러 이상의 디지털 자산을 보호해 왔습니다. CertiK은 이러한 성과를 바탕으로 업계 전반의 보안 수준과 투명성 제고에 지속적으로 힘쓰고 있습니다.
또한 CertiK Skynet과 같은 블록체인 분석 도구를 통해 프로젝트에 실시간 온체인 모니터링을 제공하며, 사고 발생 시에는 스캠 프로젝트에 대한 경고를 실시간으로 커뮤니티에 전달해 프로젝트와 사용자 자산을 보호하는 사고 알림 서비스도 운영하고 있습니다.
아울러 CertiK은 이더리움(Ethereum), 바이낸스 스마트 체인(BNB Smart Chain)과 같은 Layer 1은 물론, Arbitrum, Optimism 등 Layer 2 네트워크를 포함해 다양한 블록체인 환경과 주요 스마트 컨트랙트 프로그래밍 언어 전반에 걸친 보안 감사를 수행할 수 있습니다.
보안 감사 프로세스는 무엇인가?
스마트 컨트랙트는 한 번 배포되면 원칙적으로 수정이 어렵기 때문에, 프로젝트 배포 이전에 철저한 감사를 진행하고 충분한 시간을 확보해 이슈를 해결하는 것이 매우 중요합니다.
스마트 컨트랙트 보안 감사는 여러 이해관계자 간의 협력이 필요한 과정으로, 다양한 감사 기법을 복합적으로 활용해 진행됩니다. 우선 고객으로부터 감사 대상 컨트랙트 코드를 전달받은 뒤, 본격적으로 취약점 분석을 수행합니다. 이 단계는 크게 정형 검증과 수동 검증으로 구성되며, 각 방식의 장점을 결합해 잠재 리스크를 보다 정밀하게 식별합니다.
정형 검증은 스마트 컨트랙트의 모든 변수와 가능한 값을 체계적으로 검증해, 컨트랙트의 전반적인 상태를 자동으로 확인하는 프로세스입니다. 이 과정에서 컨트랙트의 완전성과 안정성에 영향을 미칠 수 있는 잠재적 리스크가 발견되면 즉시 경고가 발생해, 문제를 조기에 인지하고 대응할 수 있도록 합니다.
수동 검증은 감사팀이 스마트 컨트랙트 코드의 각 라인을 직접 검토하며, 잠재적인 취약점과 코드 오류를 꼼꼼하게 식별하는 과정입니다. 아래에는 스마트 컨트랙트 보안 감사 과정에서 가장 빈번하게 발견되는 대표적인 취약점 유형이 정리돼 있습니다. 감사팀은 이와 같은 방식으로 스마트 컨트랙트 코드 전반에 대한 포괄적인 보안 평가를 수행하고, 각 취약점에 대한 상세한 분석 보고서와 함께 구체적인 수정 권고 사항을 제공합니다. 권고 사항이 반영되어 문제가 해결된 경우에는 해당 항목이 수정 완료로 표시되며, 수정되지 않은 사항은 최종 보고서에 모든 리스크가 그대로 명시됩니다.

보안 취약점이란 무엇인가?
보안 취약점이란 스마트 컨트랙트가 원활하고 안전하게 작동하는 데 영향을 미칠 수 있는 모든 요소를 의미합니다. 예를 들어 계산 로직의 오류나 중앙화된 주소에 불필요하게 부여된 과도한 권한 등이 이에 해당할 수 있습니다.
스마트 컨트랙트 보안 감사 보고서는 리스크를 5가지로 분류합니다.
- Critical (크리티컬 리스크)
- Major (큰 리스크)
- Medium (보통 리스크)
- Minor (작은 리스크)
- Informational (참고 사항)
Critical 리스크는 플랫폼의 안전한 운영에 직접적인 영향을 미치는 중대한 위험 요소로, 서비스 출시 이전에 반드시 해결돼야 합니다. 이러한 리스크가 남아 있는 프로젝트는 투자 대상으로 적합하지 않습니다.
Major 리스크에는 중앙화 구조로 인한 문제나 논리적 오류 등이 포함될 수 있으며, 특정 조건에서는 자금 손실이나 프로젝트에 대한 통제력 상실로 이어질 가능성이 있습니다.
Medium 리스크는 토큰 보유자의 자금에 즉각적인 위협을 주지는 않지만, 플랫폼의 전반적인 기능이나 안정성에 부정적인 영향을 미칠 수 있습니다.
Minor 리스크는 Critical·Major·Medium 리스크에 비해 영향도는 낮지만, 상위 단계의 리스크로 확대될 가능성을 내포하고 있습니다. 프로젝트 전체를 심각하게 훼손하지는 않더라도, 이러한 리스크가 존재할 경우 다른 대안 대비 효율성이 떨어질 수 있습니다.
Informational 항목은 모범 사례에 부합하도록 코드 스타일이나 특정 구현 방식을 개선하기 위한 권장 사항을 의미합니다. 일반적으로 스마트 컨트랙트의 전반적인 기능이나 보안에는 직접적인 영향을 미치지 않습니다.
스마트 컨트랙트 보안 감사에서 발견되는 가장 일반적인 5가지 취약점은 다음과 같습니다.
중앙화 리스크
중앙화는 프로젝트 운영자와 사용자 모두에게 잠재적인 위험 요소가 될 수 있습니다. 특정 주소에 과도한 관리자 권한이 집중되고 해당 개인 키가 유출될 경우, 개발자는 프로젝트에 대한 통제력을 상실할 수 있으며, 사용자는 자산에 대한 통제권을 잃을 위험에 노출됩니다.
특히 투자자를 모집한 뒤 자금을 탈취하는 이른바 ‘러그풀(Rug Pull)’ 프로젝트는 중앙화된 특권을 악용하는 사례가 많습니다. 이러한 이유로 불필요한 중앙화를 최소화하는 것은 신규 프로젝트가 커뮤니티와의 신뢰를 구축하는 데 중요한 요소로 작용합니다.
분산형 자율조직(DAO)에 관리자 권한을 부여하는 방식은 프로젝트의 토큰 보유자들이 의사결정과 미래 방향성에 직접 참여할 수 있도록 하는 하나의 대안입니다. 또한 타임록(Timelock)은 중앙화를 완전히 제거하지는 않지만, 위험을 완화하는 보완책으로 활용될 수 있습니다. 프로토콜 변경이 적용되기까지 최소 대기 시간(예: 24시간)을 설정함으로써, 토큰 보유자들이 변경 사항을 검토하고 필요 시 유동성을 보호할 수 있는 시간을 확보할 수 있습니다.
이벤트 발행 누락
일부 스마트 컨트랙트 기능은 호출 시 반드시 이벤트를 발행하도록 설계돼야 합니다. 이벤트 발행은 민감한 변수의 상태 변경을 기록하거나, 중요한 프로세스가 실행됐음을 외부에 알리는 역할을 합니다. 초기 단계에서는 이러한 절차가 필수적이지 않을 수 있지만, 장기적인 운영과 추적 가능성을 위해서는 이후 모든 실행 과정에서 일관되게 적용되는 것이 바람직합니다.
잠금 해제된 컴파일러 버전
컴파일러는 고수준의 소스 코드를 컴퓨터가 실행할 수 있는 저수준 언어로 변환하는 역할을 합니다. 이더리움 스마트 컨트랙트를 위해 설계된 전용 언어인 솔리디티(Solidity) 역시 CertiK의 DeepSEA와 마찬가지로 컴파일러를 사용하는 프로그래밍 언어입니다. Solidity 컴파일러는 다양한 버전이 존재하며, 새로운 기능과 개선 사항이 포함된 업데이트가 빈번하게 출시됩니다.
스마트 컨트랙트는 사용되는 컴파일러 버전을 명시적으로 지정하고 고정해야 합니다. 컴파일러 버전이 고정되지 않을 경우, 서로 다른 버전의 컴파일러로 컨트랙트 소스 코드가 컴파일될 수 있으며, 이는 컴파일 과정에서 생성되는 바이트코드의 차이로 이어져 예기치 않은 동작이나 보안 리스크를 초래할 수 있습니다.
입력값 검증의 부재
입력값을 검증하는 것(예를 들어 함수 내 특정 변수가 0보다 큰지 확인하는 방식)은 컨트랙트의 동작 범위를 사전에 정의된 안전한 조건 내로 제한하는 역할을 합니다. 스마트 컨트랙트는 공개적으로 배포되어 누구나 변수에 접근하고 상호작용할 수 있기 때문에, 예기치 않거나 악의적인 이벤트가 발생할 가능성을 최소화하는 입력 검증은 필수적인 보안 절차입니다.
제3자에 대한 의존도
서드파티 의존관계는 가능한 피해야 합니다. 개발자는 자신의 코드의 보안을 제어할 수 있을 뿐, 자신의 코드가 상호 작용하는 외부 컨트랙트의 보안까지는 통제할 수 없습니다. Security Oracle과 같은 도구는 상호 작용이 승인되기 전에 외부 컨트랙트가 소정의 보안 수준을 충족하는지 확인함으로써 안전장치 역할을 할 수 있습니다. 다만 DeFi의 목표는 모든 형태의 중앙화를 제거하는 데 있다는 점을 함께 고려해야 합니다. 상호운용성은 스마트 컨트랙트의 기능과 가능성을 확장하지만, 이를 위해서는 모든 스마트 컨트랙트가 일정 수준의 보안 기준과 분산화 원칙을 충족하는 것이 필요합니다.
보안 리스크 점수란 무엇인가?
스카이넷에 등록된 프로젝트는 보안 점수(Security Score)를 기준으로 순위가 매겨집니다. 스마트 컨트랙트 보안 감사 과정에서 발견된 취약점을 적극적으로 해결한 프로젝트는, 리스크를 해소하지 않은 프로젝트보다 더 높은 점수를 받게 됩니다. 또한 Skynet과 Security Oracle과 같은 실시간 모니터링 솔루션을 활용하면 분 단위로 최신 보안 데이터를 확인할 수 있어, 프로젝트의 전반적인 보안 상태를 지속적으로 개선하고 리더보드 순위 상승에도 긍정적인 영향을 줄 수 있습니다.
프로젝트의 보안 점수에 영향을 미치는 세부 요소는 CertiK 스카이넷 내 각 프로젝트 페이지에서 확인할 수 있습니다.
