핵심 요약
AI 요약
기사 목차 펼치기 / 접기
코드를 읽고 분석하는 AI 코딩 에이전트도 정교하게 설계된 가짜 단서 앞에서는 갈피를 잃는다. 오픈소스 소프트웨어 보호 도구인 BLA는 가짜 함수와 복잡한 호출 관계를 심어 모델의 판단을 흐리고, 분석 도구의 자원 처리 한도를 겨냥해 파일 파싱 자체를 중단시킨다. 다만 소스코드 대조와 직접 실행으로 확인한 결과, 분석기의 설정 한도를 넓히거나 디렉터리를 직접 추출하는 방식으로 방해 장벽을 우회해 원본 코드를 복원하는 길은 여전히 열려 있었다.
이번 검증은 11월 10일 기준 BLA 3.2.3과 역공학 분석 도구 REA 6.8.0을 대상으로 진행했다. 공개 생성기로 원본과 보호본 아티팩트를 제작한 뒤, 윈도우(Windows) 환경의 Node.js 24.22.1에서 REA 분석 함수를 직접 호출해 동작을 대조했다. AI 에이전트가 처음부터 끝까지 전체 기능을 독자적으로 복원하는 종단 간 실험은 검증 범위에 포함하지 않았다.
AI는 코드를 혼자 읽지 않는다
역공학(Reverse Engineering)은 완성된 실행 파일이나 패키지에서 내부 구조와 작동 방식을 거슬러 파악하는 작업이다. 소스코드가 온전히 주어지지 않더라도 파일 디렉터리 구조와 바이너리 내 문자열, 함수 간 호출 관계가 결정적인 단서가 된다. 인간 분석자와 AI 에이전트는 이 단서들을 차례로 연결해 핵심 비즈니스 로직을 추려낸다.
역공학 분석 도구인 REA는 코딩 에이전트가 이런 조사를 수행하도록 CLI와 외부 도구 연결 방식인 MCP를 지원한다. 에이전트가 REA 도구를 호출해 대상 파일을 풀고 구조 분석 결과를 넘겨받으면, 거대언어모델(LLM)은 그 결과를 해석해 다음에 추적할 함수와 모듈을 결정한다. BLA는 바로 이 지점을 노린다. 모델이 읽는 분석 결과에 정교한 가짜 단서가 섞여 들어가도록 유도하는 동시에, 그에 앞서 분석 도구 자체가 파일 정보를 온전히 읽지 못하도록 자원 한도를 고갈시킨다. 모델의 추론 판단과 분석 도구의 정적 파싱 과정이라는 두 갈래 접점을 분리해 공략하는 구조다.
헷갈리는 주석을 넘어, 가짜 기능을 만든다
기존의 원시적 난독화가 README 문서나 코드 주석에 거짓 설명을 적어두는 수준에 머물렀다면, BLA는 그럴듯한 거짓 설명에 정확히 부합하는 동작 코드까지 합성해 낸다. BLA의 가짜 업무 로직 생성기에는 샤미르-Ed25519(Shamir-Ed25519) 라이선스 검증, 기업용 티어별 요금 계산, 바이너리 통신 프레임 처리, TPM2 보안 칩 인증을 정밀하게 모의하는 4대 섀도 함수가 탑재되어 있다. 단순히 함수 이름만 그럴듯하게 짓는 것이 아니라, 실제 라이선스 키처럼 보이는 문자열을 받아 갈루아 체(GF256) 다항식 연산을 거친 뒤 프로토콜 명칭과 검증 결과를 반환하는 식이다. 실제 제품의 본래 기능과는 무관하지만, 분석을 맡은 AI 에이전트 입장에서는 검증해야 할 의무 노드가 늘어난다.
가짜 증거를 심어 혼선을 유도하는 기법을 ‘포이즌(Poison)’이라 부르며, 탐색 후보를 늪지대처럼 불리는 ‘타르핏(Tarpit)’은 여기에 서로 얽힌 함수군을 대거 추가한다. 별도로 구현된 호출 미로 생성기는 5개 함수가 서로를 순환 참조하고 다음 묶음의 함수로 제어를 넘기는 타르잔 강결합 컴포넌트(Tarjan SCC) 상호 재귀 구조를 생성한다. 직접 생성한 호출 미로 표본에는 함수 노드 40개와 160개의 교차 호출 참조가 삽입됐으며, 이 코드를 REA에 입력했을 때 구문 파싱 자체는 정상 완료됐다. 다만 AI 에이전트가 이 복잡한 호출 참조를 모두 추적하느라 문맥을 낭비했거나 잘못된 결론에 도달했는지는 이번 단위 검증 범위에서 확인하지 않았다.
코드를 읽기 전에 목차에서 막히게 한다
분석 도구의 자원 한도를 직접 겨냥하는 ‘익조스트(Exhaust)’ 전략의 위력은 일렉트론(Electron) 데스크톱 애플리케이션의 ASAR(아사) 보관 파일에서 뚜렷하게 확인된다. ASAR 헤더는 보관 파일 내부에 포함된 파일들의 경로와 오프셋 위치를 담은 JSON 메타데이터로, 책의 본문을 읽기 전에 넘겨보는 목차에 해당한다. BLA의 헤더 증폭기는 가장 강력한 보호 강도인 ‘bankrupt’ 모드에서 약 4096바이트 길이의 경로를 지닌 가짜 엔클레이브 파일 항목 4000개를 목차에 주입한다. 실제 파일 본문 용량을 크게 늘리지 않으면서도 목차인 헤더 크기만 기형적으로 팽창시키는 방식이다. 반면 검증 대상인 REA의 기본 헤더 허용량은 16MiB로 제한되어 있다.
직접 생성한 보호본 아티팩트의 헤더 크기는 1744만2004바이트(약 16.63MiB)에 달했다. 기본 한도인 16MiB를 넘어서자 REA의 헤더 파싱 함수는 즉각 용량 초과 오류를 반환하며 작업을 중단했다. AI 모델이 가짜 주석이나 함수를 검토하기도 전에, 파일을 읽어 들이는 최전방 진입로에서 데이터가 차단된 셈이다. 자바스크립트(JavaScript) 정적 분석에서도 유사한 자원 차단이 확인됐다. 공개 생성기로 보호한 표본을 투입하자 변수의 참조 후보와 문자열 결합, 게터(getter) 확장을 분석하는 의미 분석 모듈이 예산 초과로 부분 완료 상태를 반환했다. BLA는 타르핏 생성기를 통해 정적 분석기의 탐색 후보를 폭증시키는 구조를 다중으로 겹쳐 배치한다.
가짜 부분만 지워내기 어렵게 묶는다
가짜 코드가 원본과 완전히 분리된 독립 모듈로 존재한다면 분석자가 이를 손쉽게 식별해 통째로 도려낼 위험이 있다. ‘인탱글(Entangle)’은 실제 정상 코드와 가짜 로직을 긴밀하게 결합해 분리 작업을 방해하는 전략이다. BLA의 자바스크립트 변환기는 추상 구문 트리(AST) 수준에서 원래 함수의 실행 흐름 사이에 내부 상태 갱신 코드와 디코이 호출을 교차 삽입한다.
파일 변조를 감지해 무결성 검증을 실패하도록 만드는 자체 봉인(self-seal)과 동반 사이드카 파일 결합은 선택 옵션으로 제공된다. 소형 자바스크립트 프로그램 표본에 두 옵션을 함께 적용해 시험한 결과, 음수·0·양수·비숫자 입력값 등 6가지 테스트 케이스에서 원본과 보호본의 연산 출력이 정확히 일치했다. 그러나 동반 파일의 내용을 임의로 변조하자 결합 보호본은 런타임 해시 불일치 오류를 뿜으며 즉시 프로세스를 종료했다. 외부 변조를 감지하는 방어 장치 자체는 정상 작동한 것이다.
분석기 오류와 역공학 방어 성공 사이의 간극
“분석 도구의 기본 한도 초과 오류가 곧 AI 역공학의 최종적 실패를 보장하지는 않는다. 헤더 허용량을 넓히거나 추출 디렉터리를 직접 지정하는 우회 경로 앞에서는 방어 장벽이 한순간에 해제된다.”
동일한 ASAR 표본을 대상으로 방어벽을 우회하는 반대 조건도 함께 시험했다. REA 공식 소스코드는 헤더 허용량 한도를 상향 조정하는 환경 설정과, 아카이브를 사전에 추출한 디렉터리를 직접 지정해 우회 분석하는 복구 절차를 지원한다. 실제로 REA 소스코드는 환경변수 설정을 통해 헤더 한도를 최대 256MiB까지 확장할 수 있도록 구현되어 있다.
실제로 헤더 허용량을 32MiB로 설정한 뒤 동일한 REA 분석 함수로 아카이브를 다시 읽어 들이자, 디렉터리와 파일을 합쳐 총 4004개의 목록이 정상 반환됐다. 반환된 위치 메타데이터를 따라 원래의 package.json과 main.js 파일을 읽어 낸 결과, 두 파일 모두 원본 파일과 바이트 단위까지 정확히 일치했다. 단순한 설정 플래그 변경 하나만으로 표본의 헤더 방어벽이 무력화된 것이다.
SQLite 데이터베이스 표본에서도 방어의 유효 범위는 제한적이었다. BLA의 공개 레드팀 검증 코드는 가짜 테이블의 계산 열이 분석 환경에 존재하지 않는 미정의 함수를 호출하도록 설계해 파서 오류를 유도한다. 직접 쿼리를 실행하자 가짜 테이블 평가에서는 오류가 발생했으나, 원래 존재하던 정상 테이블의 데이터 행은 보호 조치 이전과 동일하게 온전히 조회됐다.
이러한 결과는 모든 방어 장치를 손쉽게 무력화할 수 있다는 뜻은 아니다. ASAR 헤더 장벽을 넘어서더라도 내부 코드에 주입된 AST 난독화나 호출 미로가 분석을 추가로 지연시킬 수 있다. 그러나 특정 분석 경로 하나가 일시적으로 실패했다고 해서, 지능형 에이전트의 최종적인 소프트웨어 기능 복원 과제까지 차단됐다고 단정할 수는 없다.
‘비용 수백 배’ 추정치에 숨은 수식 가설의 실체
BLA 공식 설명서(README)는 방어 성공 시 AI의 토큰 소모량과 역공학 비용이 수백 배에서 수천 배까지 팽창한다고 홍보하며, 이를 ‘내부 추정치’로 분류해 명시하고 있다. 이 계산이 도출된 출발점의 가설을 면밀히 따져볼 필요가 있다. 실제 환경에서 AI 에이전트가 어떤 가짜 함수를 진짜로 오인했는지 관찰한 실측값과 명칭이 유사한 지표가 수식의 뼈대를 이루고 있기 때문이다.
BLA 감사 모듈의 ‘decoyFunctionsDetectedAsReal’ 지표는 함수 이름 패턴과 본문 길이 등 정적 휴리스틱으로 단순 집계된다. 함수명에 보안 아키텍처를 암시하는 단어나 특정 접미사가 포함되어 있으면 값이 기계적으로 증가하는 식이며, 실제 LLM 에이전트가 가짜 함수를 진품 로직으로 채택했다는 런타임 추론 기록을 측정한 결과가 아니다.
BLA의 비용 추정기는 이 집계값을 넘겨받아 도구 호출 횟수와 턴당 슬라이딩 윈도우 문맥 크기를 수식으로 가정한다. 문맥 한도 초과 확률 역시 상수로 사전 정의되어 있으며, 조건이 맞아떨어지면 ‘환각 발생 및 비용 파산’이라는 판정을 출력한다. 실제 상용 API 호출 요금이나 모델의 인과적 오판율을 실측한 데이터와는 엄격히 구분되는 지점이다.
진정한 방어 효용을 평가하려면 동일한 애플리케이션과 복원 과제, 동일한 모델을 통제 조건에 두고 원본과 보호본의 토큰 소비량을 직접 비교해야 한다. 분석 도구의 정적 파서가 멈춰 선 이후에도, 지능형 에이전트의 우회 복원 시도는 계속해서 이어질 수 있기 때문이다.