순서는 편집상의 배치가 아닙니다. 각 층은 앞 층이 만들어 낸 것을 소비하며, 각 층의 정의는 무엇을 잡아내는가만큼이나 무엇을 잡아내지 못하는가로도 이루어집니다. 이 사각지대들이 여기 인쇄된 이유는 리포트에 인쇄된 이유와 같습니다: 사거리를 감추는 도구는 보정할 수 없는 도구입니다.
201개 탐지기가 Solidity 소스를 훑습니다: 확인하지 않은 반환값, 재진입 형태, 발행과 자금 인출 경로, owner의 권한, 프록시와 업그레이드 경로, 그리고 시뮬레이션된 매수·매도 — 허니팟에 빠지기 전에 알아보게 합니다. 엔진은 사용자의 기기에서 돌고, 공개하지 않은 컨트랙트가 한 번 읽히자고 업로드되지 않습니다. 사각지대: 어떤 경로가 컨트랙트가 실제로 만나게 될 수치에서도 도달 가능한가. 이 층은 아무것도 실행하지 않으며, 그 아래 모든 층도 마찬가지입니다.
소스는 하나의 주장이고, 배포된 바이트코드가 사실입니다. 이 층은 디스패처를 읽어 컨트랙트가 실제로 노출하는 셀렉터를 얻고, 시그니처 말뭉치와 대조해 원시 calldata에 이름을 붙이고, 라이브러리 코드를 빼서 손으로 쓴 줄만 남기고 — 감사자가 가장 먼저 읽어야 할 것이 바로 그것입니다 — 어떤 주소의 자금이 어디서 왔는지 보고하며, 각 답에 그것을 만들어 낸 명단의 출처를 붙입니다. 사각지대: 의도, 그리고 아무도 불러오지 않은 명단. 이 제품에는 어떤 제재 명단도 컴파일되어 있지 않습니다. 라벨 명단이 하나도 로드되지 않았을 때, 리포트는 사용자가 '이미 걸러졌다'고 오해할 수 있는 깨끗한 결과를 돌려주는 대신 그 사실을 그대로 말합니다.
각 경로에는 질문이 하나씩 붙습니다 — '지분 하나를 비싸게 만들어서 실제 입금이 0지분을 사게 만들 수 있는가?' — 그리고 전제 조건 목록과, 각 조건이 차지하는 가중치가 붙습니다. 스캔이 그 필수 전제 조건을 실제로 증명했을 때만 이 경로가 나가고, 조건마다 증거가 붙습니다. 코드가 그 경로를 떠받치지 못하면 그 경로는 나타나지 않습니다. 사각지대: 온체인 실시간 상태 — 잔액, 유동성 깊이, 개인키를 누가 쥐고 있는지, owner가 멀티시그인지. 여기서 신뢰도는 '증명된 전제 조건의 비율'이지, 결코 '공격이 성공할 확률'이 아닙니다.
모델의 일은 3층이 이미 경로를 확립한 다음에야 시작됩니다: 그 경로를, 방어자가 막을 수 있을 만큼 충분히 독자 자신의 언어로 설명하는 일입니다. 시나리오를 생성하라는 요구를 받지도 않고, 추가할 수도 없습니다 — 자신만만하고 반증할 수 없는 가짜 공격 목록은 그 하나의 진짜 발견을 그 아래 묻어 버리기 때문입니다. 사각지대: 의도. 어떤 특권 설계가 실수인지, 누군가 의도한 결정인지는 알려 줄 수 없습니다.
모든 발견을 심각도, 증거, 수정 방법과 함께 남깁니다. 전달된 리포트의 공개 아카이브. '체인에서 직접 읽은 현황'과 '누군가 되돌려 준 점수'를 엄격히 나누고 후자에는 날짜를 붙이는 배지. 그리고 리포트에 서명이 들어간 뒤에도 그 주소를 계속 지켜보는 모니터링 — 어떤 컨트랙트든 통과한 다음 주에 owner가 바뀔 수 있으니까요. 포함하지 않는 것: '안전하다'는 어떤 단언도. 리포트는 무엇을 시험했고 무엇이 성립했는지를 진술합니다 — 안전을 약속하는 리포트는 의심받아야 할 리포트입니다.
모든 경로는 코드가 탐지기 출력에서 조합해 낸 것이고, 주장하는 전제 조건마다 증거가 붙습니다. AI는 이미 존재하는 경로를 설명할 뿐, 하나를 더할 능력은 애초에 없습니다. 규모와 깊이와 절제는 서로 다른 세 가지 주장이며, 여기서는 그것을 나눠서 말합니다.
도구 자체(스캐너, 콘솔, SAFI 워크스페이스)의 화면은 아직 영어입니다. 이 페이지들은 그 안으로 들어가기 전에 무엇을 하게 되는지 한국어로 끝까지 설명해 드립니다.
ATK-VAULT-INFLATION: 받아들여진 약점 둘과 빈 풀 하나. 3층이 1층의 산출물로 하는 일이 바로 이것입니다 — 아래 두 조각은 따로 보면 심각한 문제가 아니고, 심각도순으로 정렬된 발견 목록이 이것을 숨기는 이유가 정확히 그것입니다.
Euler Finance는 같은 방식으로 지렛대가 걸리는 회계 방식 때문에 1억 9,700만 달러를 잃었습니다.
먼저 첫 예치자가 되어 정확히 1지분을 발행합니다. 그다음 큰 금액을 컨트랙트에 직접 보내면, 새 지분 없이 뒤에 깔린 자산만 늘어납니다. 다음 정직한 예치는 새로운 1지분 가격보다 작아서, 받을 수 있는 지분이 0으로 내림됩니다. 그들의 돈이 옮겨진 것이 아닙니다 — 산술이 그것을 흡수해 당신의 그 1지분을 떠받치는 데 썼을 뿐입니다.
지분 조작 탐지기 하나와 내림 탐지기 하나가 발동했고, 이 컨트랙트는 가치를 직접 받을 수 있습니다. 발견 세 건이며, 그중 심각 등급은 하나도 없고, 목록의 서로 다른 자리에 흩어져 있습니다.
함수 표에는 MIN_, deadShares, initialMint 같은 이름이 하나도 존재하지 않습니다.
배포된 셀렉터를 읽는 것이야말로 '존재하지 않는다'와 '읽지 못했다'를 가르는 경계입니다: 그 데드 셰어 방어는 읽히지 않은 것이 아니라 없는 것입니다.
필요한 전제 조건이 전부 충족되어 이 경로가 나가고, 조건마다 증거가 붙으며, 신뢰도는 스캔이 그중 얼마만큼을 증명했는지를 정확히 말해 줍니다.
수정 방법: 배포 시 데드 셰어를 발행하거나 내부적으로 따로 회계하기. 지분 지급의 내림 방향을 예치자에게 유리하게 바꾸기. 0지분이 발행될 예치를 거부하기.
위의 네 단계를, 독자 자신의 언어로, 그 경로를 막을 수 있을 만큼 충분히.
이 단계가 마지막인 이유는 모델이 관여하는 유일한 고리이기 때문이며 — 그 입력은 앞의 세 층이 이미 증명해 둔 것입니다.