← 최신 논문
💻 computer science

CHC-based Automated Verification of WebAssembly Programs

본 논문은 제약된 혼 클로즈(constrained Horn clauses)를 사용하여 WebAssembly의 일부 서브셋에 대한 자동화된 정적 검증 방법을 제안하며, 이는 타입 기반 필터링을 통해 간접 함수 호출을 효과적으로 처리하고 제어 흐름 분석 요약을 통해 대규모 패닉 핸들러를 관리한다.

원저자: Akihisa Yagi, Ken Sakayori, Naoki Kobayashi

게시일 2026-07-21
📖 4 분 읽기☕ 가벼운 읽기

원저자: Akihisa Yagi, Ken Sakayori, Naoki Kobayashi

원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기

인터넷을 모든 건물이 웹사이트인 거대하고 북적이는 도시라고 상상해 보세요. 수년 동안 이 건물들은 안전하지만 때로는 건설 속도가 느린 특정하고 무거운 설계도를 바탕으로 지어졌습니다. 그러던 중, 웹 어디든 날아다닐 수 있는 새로운 고효능의 범용 언어인 웹어셈블리(WebAssembly)가 등장했습니다. 이것은 게임, 도구, 앱을 브라우저에서 바로 실행할 수 있도록 무거운 코드를 실어 나르는, 빠르고 강력한 범용 고속 드론 시스템과 같습니다. 이 드론들은 매우 빠르고 강력하기 때문에, 우리는 드론이 건물에 충돌하거나 화물을 엉뚱한 곳에 떨어뜨리지 않도록 보장해야 합니다. 이것이 바로 "검증(verification)"의 역할입니다. 검증이란 프로그램이 실행되기 전에 그것이 안전하다는 것을 수학적으로 증명하는 아주 멋진 단어입니다.

이를 위해 컴퓨터 과학자들은 종-종 "만족도 해결사(Satisfiability Solver)"라는 도구를 사용합니다. 이 해결사를 규칙들을 살펴보고 어떤 시나리오가 가능할지 혹은 불가능할지를 즉각적으로 알려주는 매우 똑똑한 탐정이라고 생각해 보세요. 만약 규칙이 "드론은 하늘에 있어야 한다"와 "드론은 지면에 있어야 한다"를 동시에 말한다면, 탐정은 그것이 모순임을 알고 그 계획은 안전하지 않다고 판단할 것입니다. 이 논문은 그 탐정에게 웹어셈블리의 특유하고 까다로운 규칙들, 특히 다른 함수를 간접적으로 호출하거나 거대한 에러 메시지를 처리하는 부분을 이해하도록 가르칩니다.


변신하는 호출의 미스터리

도쿄 대학교의 야기 아키히사, 사카요리 켄, 코바야시 나오키 저자들은 까다로운 퍼즐에 직면했습니다. 웹어셈블리 프로그램은 책(함수)을 동적으로 서가에서 꺼낼 수 있는 거대한 도서관과 같습니다. 때때로 코드는 "책 A를 펴라"라고 말하는 대신, "5번 선반에 있는 책을 펴라"라고 말합니다. 이것을 **간접 함수 호출(indirect function call)**이라고 부릅니다.

문제는 만약 5번 선반에 무엇이 있을지 확인하기 위해 도서관의 모든 책을 일일이 확인하려 한다면, 탐정(해결사)이 과부하에 걸린다는 점입니다. 이는 마치 맞는 열쇠를 찾기 위해 백만 개의 자물쇠 조합을 하나하나 다 확인하려는 것과 같습니다. 순진한 접근 방식은 모든 가능성을 나열하는 것이지만, 이는 어떤 컴퓨터도 합리적인 시간 내에 해결할 수 없는 엄청난 양의 서류 더미를 만들어냅니다.

저자들의 해결책은 매우 엄격한 사서처럼 행동하는 것이었습니다. 그들은 웹어셈블리에 한 가지 규칙이 있다는 것을 깨달았습니다. 즉, 당신이 찾고 있는 특정 장르(타입)와 일치하는 책만을 선반에서 꺼낼 수 있다는 것입니다. 따라서 도서관의 모든 책을 확인하는 대신, 그들의 방법은 호출 지점에서 요구되는 "장르"를 살펴보고 이에 맞지 않는 모든 책을 걸러냅니다. 이 방식은 후보 목록을 획기적으로 줄여 탐정의 업무를 훨씬 쉽게 만듭니다. 그들은 또한 두 번째 기술을 추가했습니다. 만약 도서관 선반이 잠겨 있고 절대 변하지 않는다면(읽기 전용), 정확히 어떤 책이 어디에 있는지 미리 계산하여 복잡한 퍼즐을 단순한 "만약 이렇다면, 저렇다" 식의 규칙으로 바꿀 수 있습니다.

거대한 패닉 버튼

두 번째 도전 과제는 "패닉 핸들러(panic handler)"였습니다. 어떤 프로그램이 실수를 했을 때, 단순히 멈추는 것이 아니라, 마지막에 포기하기 전까지 진단 차트와 에러 코드를 곁들여 정확히 무엇이 잘못되었는지 설명하는 10,000단계의 방대한 연설을 시작한다고 상상해 보세요. 웹어셈블리에서 이러한 패닉 핸들러는 문제가 발생했을 때 트리거되는 거대한 코드 블록입니다.

안전 검사기에게 이 방대한 연설은 주의를 분산시키는 요소일 뿐입니다. 중요한 것은 프로그램이 결국 안전하게 멈춘다(unreachable 명령에 도달한다)는 사실뿐입니다. 에러 메시지를 구성하는 길고 긴 과정은 프로그램이 충돌하고 있다는 사실 자체를 바꾸지는 않습니다. 하지만 만약 탐정이 그 10,000단계의 연설 과정을 하나하나 추적하려고 한다면, 작업이 지연될 것입니다.

저자들은 "요약(summarization)" 기법을 도입했습니다. 그들은 만약 어떤 코드 블록이 단순히 충돌으로 이어지는 과정이라면, 중간 단계를 생략할 수 있다는 것을 깨달았습니다. 그들은 제어 흐름 분석을 사용하여 이러한 길고 구불구불한 경로를 식별하고, 이를 간단한 지름길로 대체했습니다: "이 방에 들어오면, 당신은 결국 충돌하게 된다." 이는 가이드에게 "로비에 대한 50분짜리 역사 강의는 건너뛰고, 출구가 막혀 있다는 것만 알려주세요"라고 말하는 것과 같습니다. 이를 통해 검증 작업이 에러 메시지의 소음 속에 길을 잃지 않고 핵심적인 안전 문제에 집중할 수 있게 합니다.

결과: 진행 중인 작업

아이디어를 테스트하기 위해 팀은 WASMVERIFIER라는 프로토타입 도구를 구축했습니다. 그들은 Rust와 C로 작성된 일부 프로그램을 포함하여 90개의 서로 다른 프로그램을 이 도구에 입력하고, 그것들이 안전한지 증명하도록 요청했습니다.

결과는 유망했지만 완벽하지는 않았습니다. 두 가지 서로 다른 탐정 해결사(Z3 Spacer 및 Eldarica)를 사용하여, 이 도구는 약 54개에서 56개의 프로그램에 대해 안전성을 확인하거나 입증하는 데 성공했습니다. 그러나 약 20개에서 22개의 프로그램에서는 시간 초과(timeout) 또는 메모리 부족으로 인해 한계에 부딪혔습니다. 약 11개에서 12개의 사례에서는 프로그램이 실제로는 괜찮음에도 불구하고 안전하지 않다고 판단하는 "오탐(false alarm)"이 발생했습니다. 저자들은 이러한 오탐이 지원되지 않는 일부 명령어를 "충돌(crash)" 자리 표시자로 대체해야 했기 때문에 발생했으며, 이로 인해 안전 검사가 너무 보수적으로 이루어졌다고 설명합니다.

이 논문은 이 접근 방식이 완전 자동화된 안전 검사를 위한 강력한 진전이지만, 아직 마법의 지팡이는 아니라고 제안합니다. 저자들은 특히 비트(bit-vectors)에 대한 복잡한 수학적 연산을 처리하는 방식과 아직 완전히 이해하지 못한 명령어를 다루는 방식에 있어 이 방법이 여전히 정교화되는 과정에 있다고 언급했습니다. 그들은 이 방법이 건전하고 완전(sound and complete)할 것이라고 추측하지만, 아직 이에 대한 공식적인 수학적 증명을 작성하지 않았으며, 이를 향후 과제로 남겨두었습니다.

요약하자면, 이 논문은 간접 호출을 필터링하는 더 똑똑한 방법과 에러 핸들링의 번잡한 부분을 요약함으로써, 웹어셈블리에 대한 자동화된 안전 검사를 훨씬 더 실용적으로 만들 수 있음을 보여줍니다. 이는 견고한 토대이지만, 탐정은 모든 사건을 해결하기 위해 더 많은 훈련이 필요합니다.

연구 분야의 논문에 파묻히고 계신가요?

연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.

Digest 사용해 보기 →