오픈소스 LLM 에이전트 프레임워크 Agno의 PandasTools에서, 모델이 선택한 함수 이름이 그대로 호출 대상 디스패치에 쓰이는 안전하지 않은 반사(unsafe reflection) 취약점이 확인되었습니다. CVE-2026-119050으로 등록된 이 이슈는 임의의 pandas 함수 호출, 나아가 코드 실행으로 이어질 수 있다는 내용을 담고 있습니다. 다만 이번 자료에서는 공개 PoC나 실제 악용 사례가 확인되지 않았으므로, 아래 내용은 조건부 위험 평가로 읽어주시는 편이 정확합니다.
개요

CVE 레코드는 해당 취약점을 "Agno through 3.1.11 contains an unsafe reflection vulnerability in PandasTools that allows attackers to invoke arbitrary pandas functions by supplying model-controlled function names to getattr()"로 설명합니다. 즉 공격의 출발점은 네트워크 트래픽이 아니라 에이전트 도구의 인자값이며, 모델이 만들어낸 문자열이 그대로 pandas 함수 선택에 사용된다는 점이 핵심입니다. 이 이슈는 CVE 레코드 기준으로 VulnCheck CNA에 의해 PUBLISHED 상태로 등록되어 있으며, 기록된 datePublic은 2026-07-02입니다.
VulnCheck 어드바이저는 영향 대상을 agno <= 3.1.11로, 분류를 CWE-470(Use of Externally-Controlled Input to Select Classes or Code, 'Unsafe Reflection')으로, 점수를 CVSS 9.2 / 심각도 critical로 표기합니다. 취약점의 존재 여부와 심각도 표기는 CVE Project 레코드와 VulnCheck 어드바이저 두 출처가 서로 다른 축(설명 / 분류·점수)을 제공하므로, 둘을 함께 보는 것이 좋습니다.
발견자 보고는 GitHub issue #8699 "[Security] PandasTools: RCE via model-controlled pandas function selection (read_pickle)"로, 코드 위치와 악용 예, 수정 제안까지 비교적 구체적으로 문서화되어 있습니다.
영향 범위
영향 범위는 두 가지 표기로 나뉘어 전달되었습니다.
- VulnCheck 어드바이저 및 CVE 설명 기준: agno <= 3.1.11 / "through 3.1.11"
- 발견자 보고서 기준:
libs/agno/agno/tools/pandas.py(v2.6.20, main @ 07fe6b2) — 상세 코드 분석은 이 버전 스냅샷에서 수행된 표기입니다
두 버전 표기의 정확한 대응 관계는 이번 증거에서 확인되지 않았다는 점을 먼저 짚고 싶습니다. 다만 실제 노출을 가르는 것은 버전 번호보다 도구 구성입니다. 분석이 지목한 노출 조건은 다음 세 가지입니다.
- 에이전트에 PandasTools(그중에서도
create_pandas_dataframe)가 도구로 노출되어 있는가 - 모델이
create_using_function,function_parameters값을 실제로 제어할 수 있는가 - 모델 출력을 조작할 수 있는 입력 경로(사용자 입력, 문서·웹 콘텐츠 등 외부 데이터가 프롬프트로 유입되는 경로)가 존재하는가
세 조건이 동시에 성립하는 환경에서는 버전과 무관하게 점검이 필요하고, PandasTools를 노출하지 않거나 함수 선택을 코드 쪽에서 고정해 둔 배포라면 위험의 성격이 크게 달라집니다. Agno 기반 에이전트를 운영 중이라면 "버전이 몇인가"보다 "어떤 도구가 어떤 파라미터 바인딩으로 노출되어 있는가"가 1순위 점검 항목이 됩니다.
기술적 분석
문제 코드는 PandasTools의 create_pandas_dataframe()에 있습니다. 발견자 보고서가 인용한 코드에서 create_using_function과 function_parameters는 모델이 제어하는 도구 인자로 취급되고, 이 값이 그대로 dataframe = getattr(pd, create_using_f...) 형태의 디스패치에 사용됩니다. 함수 객체를 문자열로 선택하는 구조 자체가 CWE-470이 말하는 패턴이며, 이 경로에서는 pd. 이름공간에 있는 함수라면 무엇이든 호출 후보가 됩니다.
-
호출 범위: 모델이 pandas 함수 이름을 자유롭게 고를 수 있으므로, 개발자가 의도한 DataFrame 생성 함수에 호출이 제한되지 않습니다.
-
지목된 악용 예:
read_pickle. 발견자 보고서는 이를 대표 경로로 제시했고, 분석은read_pickle계열 호출이 역직렬화를 통한 악성 코드 실행으로 이어질 수 있다고 봅니다. pickle 역직렬화가 코드 실행 원형을 갖는다는 점은 이 취약점이 "데이터 읽기"에서 "프로세스 코드 실행"으로 계단을 오르는 지점입니다. -
데이터 흐름: 보고서에는 로드된 내용이 모델에 반환되는 동작이 언급됩니다. 즉 PandasTools는 함수 디스패치 채널인 동시에 데이터 회수 채널로 동작할 수 있어, 코드 실행까지 가지 않더라도 의도하지 않은 파일·경로 접근이 에이전트 동작에 드러날 수 있습니다.
-
근본 원인: 분석은 "모델 출력을 신뢰하는 도구 설계에서 입력 검증이나 화이트리스트 없이 외부 입력으로 코드 심볼을 선택하는 것"을 근본 원인으로 지목합니다. pandas API의 유연성이 아니라, 도구 스키마가 함수 선택 권한을 모델에게 위임한 설계 쪽의 문제라는 의미입니다.
운영 관점에서 이 메커니즘을 조건부로 해석하면 다음과 같습니다. 프롬프트 인젝션 등 모델 출력을 조작할 수단이 확인된 에이전트라면 이 취약점은 "이론적"이 아니라 즉시 재현 가능 단계에 가까워집니다. 반대로 모델 입력이 신뢰 영역 안에만 머무르는 내부 배치 에이전트라면, 같은 버전에서도 실질 위험은 낮아집니다. 취약점의 존재와 배포 환경의 노출도는 별개라는 구분이 우선순위를 잡는 데 도움이 됩니다.
악용 상태에 대해서는 확인된 것이 없습니다. 공개 PoC, 야생 악용 사례, CISA KEV 등재 여부는 이번 증거 수집에서 확인되지 않았습니다(조사 후 미발견). 다만 코드 경로와 악용 예가 공개 이슈로 문서화되어 있다는 사실 자체는, 일반적인 공개 타임라인을 고려할 때 임시 조치와 공식 패치 확인을 늦추지 말아야 하는 이유이기도 합니다.
대응 방안
즉시 착수 순서는 "노출 확인 → 노출 축소 → 흔적 확인 → 패치 반영"으로 잡는 것이 합리적입니다.
-
PandasTools 사용 여부 점검: Agno 기반 에이전트에서 PandasTools 및
create_pandas_dataframe가 도구 목록에 노출되어 있는지 확인합니다. 여러 에이전트를 운영한다면 도구 등록 설정 기준으로 전체 인벤토리를 먼저 뽑는 것이 빠릅니다. -
불필요한 노출 제거 또는 호출 제한: PandasTools가 없어도 되는 워크플로라면 도구에서 제거합니다. 유지해야 한다면, 모델이 함수 이름과 파라미터를 자유롭게 넘기지 못하도록 호출부를 임시 제한하는 방향을 검토할 수 있습니다. 이 조치가 공식 패치가 아니라 위험 저감책이라는 점을 구분해 두시기 바랍니다.
-
실행 흔적 확인: 에이전트 도구 호출 로그에서
create_pandas_dataframe호출 시read_pickle등 평소 워크플로에서 쓰지 않는 함수 이름이 전달된 사례가 있는지 점검합니다. 프로세스 관점에서 예상치 못한 역직렬화·파일 로드 동작이 기록됐는지도 함께 봅니다. 정확한 로그 포맷과 감사 이벤트 체계는 이번 증거에 명시되어 있지 않으므로, 각 환경의 로깅 구성에 맞춰 구현해야 합니다. 이상 징후가 발견되면 해당 에이전트의 워크플로와 프롬프트 입력 경로까지 함께 조사 대상입니다. -
업그레이드는 릴리스 확인 후: 화이트리스트로 위험 함수를 막는 방향의 수정 제안은 발견자 보고서에 diff로 제시되어 있습니다. read_pickle 등 코드 실행으로 이어질 수 있는 함수를 차단하면서 read_csv와 정상 연산은 유지하는 방식입니다. 다만 이 수정안이 업스트림에 병합되었는지, 공식 수정 버전 번호와 커밋이 무엇인지는 이번 증거로 확인되지 않았습니다. 따라서 저장소 릴리스를 직접 확인한 뒤 업그레이드 시점을 결정해야 하며, 이 글은 특정 버전으로의 업그레이드를 단정하지 않습니다.
-
설계 원칙으로 남길 것: 이번 건은 LLM 도구 설계의 일반론을 다시 확인시킵니다. 모델 제어 입력이 함수 이름·클래스·모듈 같은 코드 심볼 선택에 직접 쓰이도록 두지 않고, 화이트리스트 또는 사전에 고정된 간접 참조(키 → 함수 매핑)로 대체하는 방식이 표준이 되어야 합니다. pandas처럼 이름공간이 넓은 라이브러리를
getattr()대상으로 노출할 때 특히 동일합니다.
확인이 필요한 부분
- 공식 패치가 포함된 수정 버전 번호, 취약 코드가 수정된 정확한 커밋·릴리스 시점은 이번 증거에서 확인되지 않았습니다.
- 발견자 보고서의 v2.6.20 코드 위치와 CVE 설명의 "through 3.1.11" 버전 체계가 어떻게 대응되는지도 별도 확인이 필요합니다.
- 화이트리스트 수정안의 업스트림 병합 여부와 반영 시점은 확인되지 않았습니다.
- CVE 레코드의 datePublic(2026-07-02)과 VulnCheck 어드바이저 페이지에 표시된 날짜(10/29/2026)가 서로 달라, 공개·갱신 이력은 원문 기준으로 추가 확인이 필요합니다.
- VulnCheck 어드바이저의 CVSS 상세 벡터는 일부만 전달되어, 9.2라는 점수의 세부 근거(공격 벡터·필요 조건)를 이 글에서 세부적으로 해석하지 않았습니다.
참고자료
- CVE-2026-119050: Agno through 3.1.11 Code Execution via PandasTools Unsafe Reflection
- [Security] PandasTools: RCE via model-controlled pandas function selection (read_pickle)
- libs/agno/agno/tools/pandas.py @ d9ab0a7
- Agno through 3.1.11 Code Execution via PandasTools Unsafe Reflection | Advisories
함께 읽으면 좋은 글
- CVE-2026-111357: Ivanti Connect Secure 핵심 기능 인증 누락과 권한 상승 체인 점검
- CVE-2026-114437: go-chi ClientIPFromXFF의 X-Forwarded-For 기반 클라이언트 IP 스푸핑 점검
- CVE-2026-118527: Ivanti Connect Secure 예측 가능한 식별자와 파일 업로드 체인 점검
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!