FlawOpen

flawopen.com/Teardowns/cve-2026-105812-bedrock-agentcore-generated-code-injection

● CVE-2026-105812 · CVSS v4 8.8 · 높음
보안 연구 · FlawOpen

CVE-2026-105812: AgentCore 가져오기 코드 주입

Bedrock AgentCore Starter Toolkit 0.3.13 이하에서는 에이전트 설정이 안전하게 인코딩되지 않은 채 생성된 Python에 들어갈 수 있었습니다. 다른 사용자가 에이전트를 가져온 뒤 실행하거나 배포하면 코드가 사용자의 로컬 권한 또는 AgentCore Runtime 실행 역할로 동작할 수 있습니다. 패키지 업데이트만으로 기존 생성 산출물이 수정되지는 않습니다.[1], [2], [3]

💡 알기 쉬운 설명 (ELI5)

가져오기 도구는 에이전트 설정을 Python 명령으로 바꾸는 라벨 프린터와 비슷합니다. 수정 전에는 일부 값이 안전하게 이스케이프되지 않은 채 따옴표 사이에 붙여 넣어졌습니다. 값에 포함된 따옴표가 문자열을 일찍 닫아 뒤의 내용이 Python 문법으로 해석될 수 있었습니다. 수정은 값을 Python 문자열 리터럴로 인코딩해 데이터로 유지합니다.[2], [5]

핵심 개념 및 용어

에이전트 가져오기
Bedrock 에이전트 설정을 읽어 Strands나 LangChain 같은 프레임워크용 로컬 Python 프로젝트를 만드는 Starter Toolkit 작업 흐름입니다.[2], [5]
코드 생성
프로그램 템플릿과 설정 값 또는 기타 입력을 결합해 소스 코드를 만드는 과정입니다.[2], [5]
Python 문자열 리터럴
텍스트를 데이터로 표현하는 소스 표기법입니다. repr()은 문자를 이스케이프한 따옴표 표현을 반환해 Python 문법이 되지 않게 합니다.[5]
CWE-94
코드 생성 제어 미흡: 입력 데이터가 안전하게 인코딩되지 않고 생성된 소스 코드에 삽입되었습니다.[2], [3]
생성 산출물
에이전트 가져오기로 만들어진 로컬 또는 배포 코드입니다. AWS는 영향을 받은 산출물을 교체해야 하며 가져오기 도구만 업데이트해서는 충분하지 않다고 안내합니다.[1], [2]

프레임워크 매핑

  • 이 가이드에서 설명하는 약점의 CWE 참조: CWE-94

근본 원인 분석 (Root Cause)

취약한 가져오기 변환기는 f-string과 템플릿으로 Python 소스를 만들면서 프롬프트 등 Bedrock 에이전트 설정 값을 직접 삽입했습니다. Python 문자열 구분자가 포함된 값은 의도한 텍스트 문맥을 벗어날 수 있었습니다. 0.3.14 수정은 repr(str(value))를 사용하는 python_string_literal()과 JSON 호환 데이터를 정규화하는 python_data_literal()을 추가하고 생성 문자열을 해당 인코더에 통과시킵니다. 유지관리자 권고문에 따르면 공격 연쇄에는 같은 AWS 계정의 인증된 주체가 에이전트 데이터를 변경할 수 있어야 하고, 다른 사용자가 에이전트를 가져온 후 생성된 프로젝트를 실행하거나 배포해야 합니다. 코드는 가져온 사용자의 로컬 권한 또는 AgentCore Runtime 실행 역할로 동작합니다. AWS는 취약 버전에서 생성된 산출물이 단순 업데이트로 해결되지 않는다고 설명합니다. 0.3.14 이상으로 다시 가져오고 로컬 및 배포된 출력을 교체하세요. CVE-2026-106032는 가져오기 중 외부 OpenAPI 참조를 다루는 별도 문제이며 이 코드 생성 취약점과 다릅니다.

생성 코드 취약점에 도달하는 조건

경계문서화된 조건방어 조치
Toolkit 버전0.3.13 이하 버전은 일부 값을 안전한 리터럴 인코딩 없이 생성된 Python에 삽입합니다.0.3.14 이상으로 업그레이드하거나 @aws/agentcore로 마이그레이션하세요.
데이터를 변경할 수 있는 주체같은 AWS 계정의 인증된 주체가 Bedrock Agent의 관련 필드를 변경할 수 있습니다.에이전트 데이터 쓰기 권한을 신뢰된 주체로 제한하세요.
다른 사용자의 가져오기다른 사용자가 영향받는 Starter Toolkit 워크플로로 변경된 에이전트를 가져옵니다.다른 주체가 제공한 에이전트 데이터는 신뢰하지 말고 가져오기 전에 출처를 확인하세요.
실행 조건가져온 사용자가 생성 프로젝트를 실행하거나 배포하면 코드가 로컬 권한 또는 AgentCore Runtime 역할로 실행됩니다.격리된 최소 권한 자격 증명과 런타임 역할로 가져오기와 테스트를 수행하세요.
이미 생성된 산출물패키지를 업그레이드해도 영향받는 버전에서 이미 생성된 프로젝트는 수정되지 않습니다.수정된 버전으로 다시 가져오고 로컬 및 배포된 산출물을 교체하세요.

단계별 공격 실행 흐름

단계 1

같은 계정의 주체가 에이전트 데이터를 변경할 수 있음

전제 조건은 AWS 계정의 인증된 주체가 action-group 스키마, 협업 지침, 프롬프트 재정의 등 관련 Bedrock Agent 필드를 바꿀 수 있는 것입니다.[2]

단계 2

다른 사용자가 에이전트를 가져옴

영향을 받는 Starter Toolkit 작업 흐름이 변경된 데이터를 읽고 Python 프로젝트를 생성합니다. 결함은 코드 생성 경계에 있으며 일반 가져오기가 결과를 즉시 실행하지는 않습니다.[2], [5]

단계 3

인코딩되지 않은 값이 Python 소스에 들어감

0.3.13 이하에서는 일부 자유 형식 설정 값이 안전한 리터럴 인코딩 없이 따옴표가 있는 Python 템플릿에 삽입됐습니다.[2], [5]

단계 4

생성 프로젝트를 실행하거나 배포함

가져온 에이전트를 사용자가 실행하거나 배포하면 생성 코드가 로컬 권한 또는 AgentCore Runtime 실행 역할로 동작할 수 있습니다.[1], [2]

단계 5

업데이트하고 생성 산출물을 교체함

0.3.14는 Python 리터럴 인코딩을 추가합니다. 수정 버전으로 다시 가져와 로컬 및 배포된 출력을 교체하세요. AWS는 사용 중단된 Starter Toolkit에서 @aws/agentcore로 이전할 것을 권장합니다.[1], [5]

소스 코드 비교: 취약한 구현 vs 보안 패치

이 업스트림 diff 발췌는 취약한 변환기가 설정 값을 삼중 따옴표 Python 문자열에 직접 삽입했음을 보여줍니다. 수정은 완성된 텍스트를 python_string_literal()에 전달하고 repr()로 데이터로 이스케이프합니다. 0.3.14는 다른 생성 문자열과 JSON 호환 데이터에도 같은 원칙을 적용하며, 출력물을 파싱해 표식 문자열이 문자열 상수로 유지되는지 확인하는 회귀 테스트를 추가했습니다. 이 발췌는 소스 코드 분석이며 삽입된 값이나 실행 가능한 익스플로잇이 아닙니다.[2], [5]

소스 코드 발췌: services/import_agent/scripts/base_bedrock_translate.py 및 services/import_agent/utils.py — PRE_PROCESSING 프롬프트 관련 부분

취약한 구현
# 0.3.14 수정 전: 템플릿 값이 삼중 따옴표를 사용하는 Python 소스에 직접 삽입됐습니다.
self.prompts_code += f"""
    PRE_PROCESSING_TEMPLATE=\"""\n
    {config["basePromptTemplate"]["system"]}
    \"""
"""
보안 강화 패치
# 0.3.14: 전체 값을 Python 문자열 리터럴로 인코딩합니다
prompt = f"\n\n    {config['basePromptTemplate']['system']}\n    "
self.prompts_code += f"\n    PRE_PROCESSING_TEMPLATE={python_string_literal(prompt)}\n"

# services/import_agent/utils.py
def python_string_literal(value: Any) -> str:
    return repr(str(value))

엔지니어링 및 시스템 보안 강화 체크리스트

출처