flawopen.com/디렉터리/참고 자료
개발자 보안 참고 가이드
프레임워크, ORM, 인증, serverless 애플리케이션, AI 에이전트 실행의 보안 가정을 점검할 때 이 참고 자료를 사용하세요. 각 가이드는 기술 설명과 해결 방법을 구체적인 작동 방식에 연결합니다.
- Claude Code MemoryTrap: AI 메모리 오염 — flawopen.com
Cisco의 MemoryTrap 공개: Claude Code의 영구 메모리, v2.1.50 수정 사항과 에이전트 방어책.
- AI 에이전트 격리: 컨테이너와 마이크로VM
AI 에이전트용 컨테이너, gVisor, 마이크로VM 격리 경계를 비교합니다.
- AI 에이전트 도구 권한 제한
전용 도구, 사용자별 권한 확인, 최소 권한으로 AI 에이전트의 과도한 자율성을 줄입니다.
- AI PR 봇 SSRF 방어 — flawopen.com
신뢰할 수 없는 pull request 텍스트가 AI 도구에 미치는 영향과 봇 권한 및 네트워크 접근을 제한하는 방법을 설명합니다.
- Android addJavascriptInterface 보안 위험
WebView 브리지가 모든 frame에 네이티브 메서드를 노출하는 방식, XSS가 앱 기능에 닿는 조건, 신뢰할 수 없는 페이지의 격리 방법을 알아보세요.
- Angular XSS 방어: 안전한 기본값과 우회 API
Angular는 보간을 이스케이프하고 HTML 및 URL 바인딩을 정제합니다. bypassSecurityTrust*가 보호를 해제하는 지점과 XSS sink 감사 방법을 알아보세요.
- MIME sniffing XSS: Content-Type과 nosniff
MIME sniffing이 업로드 파일을 브라우저 문서로 처리하게 되는 방식, nosniff의 역할, 안전한 파일 제공 방법을 알아보세요.
- strncpy()가 strcpy()보다 안전한가요?
C에서 strncpy()는 strcpy()의 위험 하나를 줄이지만 널 종료를 보장하지 않습니다. snprintf와 strlcpy의 반환값 확인법을 알아보세요.
- CSP와 출력 이스케이프: 둘 다 필요할까요?
컨텍스트별 출력 인코딩은 XSS를 방지하고, CSP는 누락 시 일부 영향을 제한합니다. 두 방어를 함께 적용하는 방법을 알아보세요.
- GET 요청에 CSRF 토큰이 필요한가요?
안전한 GET은 상태를 바꾸지 않아야 합니다. CSRF 토큰이 필요한 비안전 메서드와 레거시 상태 변경 GET의 수정 방법을 알아보세요.
- CWE와 CVE: 무엇이 다른가
CWE와 CVE: 무엇이 다른가: CWE는 범주로, "SQL 인젝션"(CWE-89) 같은 버그의 유형입니다. CVE는 사례로, 문서화된 하나의 구체적 발생
- React의 dangerouslySetInnerHTML은 안전할까?
React는 JSX 텍스트를 이스케이프하지만 dangerouslySetInnerHTML은 HTML을 해석합니다. XSS 출력 지점 검토와 안전한 리치 텍스트 표시를 알아봅니다.
- Dependency Confusion: 위험과 방어
패키지 출처가 모호하면 의도하지 않은 의존성이 들어올 수 있습니다. 레지스트리 정책, lockfile, CI 통제로 위험을 줄이는 방법을 알아봅니다.
- Django ORM SQL Injection: 안전한 패턴
Django QuerySet은 값을 매개변수화합니다. Raw SQL, 동적 표현식, 쿼리 구조의 위험과 검토 방법을 알아봅니다.
- Docker 소켓 노출: 위험과 방어
Docker 데몬 소켓을 노출하면 데몬 수준의 권한을 허용할 수 있습니다. 한계, capability 위험, 더 안전한 컨테이너 설정을 살펴봅니다.
- Doctrine ORM SQL 인젝션: 안전한 쿼리
DQL과 SQL 값은 매개변수로 바인딩하세요. QueryBuilder 표현식에 남는 위험과 동적 정렬 허용 목록 구성을 설명합니다.
- DOMPurify면 innerHTML을 안전하게 만들 수 있나요?
올바른 sink에서 DOMPurify는 리치 HTML을 보호합니다. 컨텍스트 한계, 정화 후 변경, Trusted Types와 운영 점검을 설명합니다.
- .NET BinaryFormatter: 위험과 마이그레이션
Microsoft는 BinaryFormatter를 안전하게 만들 수 없다고 설명합니다. 위험, .NET 9 동작, 마이그레이션 방법을 알아보세요.
- .NET XmlReader는 XXE에 안전한가요?
XmlReader는 기본적으로 DTD를 금지합니다. .NET Framework 4.5.2 변경점, 레거시 API 차이, 안전한 XML 파싱 방법을 설명합니다.
- EF Core FromSqlRaw: 안전한 SQL 매개변수화
FromSqlRaw에는 연결한 입력 대신 별도 매개변수를 전달하세요. FromSqlInterpolated, EF Core 버전 차이, 안전한 동적 SQL을 설명합니다.
- Node.js exec() vs execFile(): 차이와 보안
Node.js의 exec()와 execFile()을 비교합니다. shell, 인자, 명령 인젝션과 API 선택 기준을 설명합니다.
- FastAPI SQL 인젝션: Pydantic이 막는 것과 막지 못하는 것
FastAPI는 요청 데이터를 검증하지만 SQL의 안전성은 쿼리 구성 방식에 달려 있습니다. SQLAlchemy 매개변수 바인딩과 동적 식별자를 안전하게 다루는 방법을 알아봅니다.
- Node.js fetch() SSRF와 안전한 URL 요청
서버 fetch()는 사용자가 고른 목적지에 접근할 수 있습니다. 고정 목적지, 리디렉션, DNS, 송신 제한을 알아봅니다.
- FreeMarker·Velocity SSTI: 안전한 템플릿 사용
템플릿 출처를 통제하고 노출되는 Java 객체를 제한하며 렌더링을 격리해 FreeMarker와 Velocity의 SSTI 위험을 낮추세요.
- GitHub Actions 스크립트 인젝션과 안전한 입력 처리
GitHub 컨텍스트 값을 run에 넣으면 shell 명령이 될 수 있습니다. env 전달, 토큰 권한, pull_request_target 위험을 알아봅니다.
- GORM Raw SQL: Go SQL 인젝션 방지
GORM Raw에서 바인딩 매개변수를 사용하세요. 값 바인딩의 안전성, SQL 식별자 allowlist, 쿼리 검토 방법을 설명합니다.
- 따옴표 이스케이프만으로 SQL Injection을 막을 수 있을까?
아니요. 매개변수화 쿼리는 데이터를 SQL과 분리합니다. 이스케이프는 DB에 종속되고 취약하므로 식별자는 허용 목록을 사용하세요.
- ORM만 쓰면 SQL 인젝션을 막기에 충분한가
ORM만 쓰면 SQL 인젝션을 막기에 충분한가: 표준 쿼리 API에 대해서는 그렇습니다. 주요 ORM은 모두 원시 SQL 탈출구도 제공하며, 그것들은
- Java XXE: DocumentBuilderFactory는 기본적으로 안전한가요?
JDK 파서는 일부 공격을 제한하지만 외부 접근을 기본 차단하지 않습니다. 안전한 설정과 Provider 차이를 설명합니다.
- Java ObjectInputStream 보안과 안전한 역직렬화
신뢰할 수 없는 Java 데이터는 readObject() 중 gadget 동작을 유발할 수 있습니다. 필터와 안전한 형식, 레거시 방어를 알아봅니다.
- Java Runtime.exec()와 Command Injection: 무엇이 다른가?
Runtime.exec(String)은 shell을 시작하지 않지만 입력이 인수를 바꿀 수 있습니다. ProcessBuilder를 쓰고 값을 검증하세요.
- Node.js ReDoS: 정규식과 CVE-2026-83606
정규식 역추적이 Node.js를 막는 방식, CVE-2026-83606 사례와 대응을 설명합니다.
- Jinja2 render_template_string()은 안전한가요?
앱이 고정한 템플릿 문자열을 사용하고 사용자 데이터는 컨텍스트로 전달하세요. SSTI, autoescape, CVE-2024-56201의 조건을 설명합니다.
- JSON.parse()가 프로토타입 오염을 일으킬까?
JSON.parse() 자체는 프로토타입을 오염시키지 않습니다. 이후 안전하지 않은 병합이나 경로 쓰기가 위험을 만듭니다. 실제 쓰기 지점을 추적하고 신뢰할 수 없는 키를 안전하게 처리하는 방법을 살펴봅니다.
- JSON.parse()는 eval()보다 안전한가요?
JSON.parse()가 입력을 데이터로 처리하는 이유, eval()의 실행 방식, reviver 콜백의 역할을 설명합니다.
- localStorage의 JWT와 HttpOnly 쿠키: 무엇이 더 안전한가 — flawopen.com
localStorage의 JWT와 HttpOnly SameSite 쿠키의 아키텍처 비교: XSS 토큰 탈취, CSRF 절충, 권장 인증 아키텍처.
- Knex.js는 SQL Injection에 안전한가요?
Knex는 값을 바인딩합니다. knex.raw() bindings와 동적 SQL 식별자 허용 목록을 설명합니다.
- lodash.merge()는 프로토타입 오염에 안전한가요?
Lodash 수정 범위는 함수와 버전마다 다릅니다. 영향 범위, 최신 수정 버전, 안전한 데이터 처리를 확인하세요.
- Markdown 렌더링은 XSS로부터 안전한가요?
Markdown이 HTML을 자동으로 안전하게 만들지는 않습니다. 원시 HTML이 전달되는 조건과 안전한 정화 방법을 알아봅니다.
- Mass Assignment: 위험과 안전한 필드 허용 목록
Mass Assignment는 사용자가 제어하면 안 되는 필드를 요청 데이터가 바꾸게 합니다. 허용 목록과 권한 검사를 알아봅니다.
- MCP 보안: 도구 권한 경계 | FlawOpen
MCP 신뢰 경계를 이해하고 로컬 도구, 권한, 사용자 동의를 제한해 데이터 노출을 방지하는 방법을 알아봅니다.
- MyBatis ${}와 #{}: SQL Injection 방지
MyBatis에서 #{}는 JDBC로 값을 바인딩하고 ${}는 SQL 텍스트를 직접 삽입합니다. 안전한 값 바인딩과 식별자 허용 목록을 알아봅니다.
- MySQLi와 PDO: 안전한 Prepared Statement
MySQLi와 PDO 모두 Prepared Statement로 SQL Injection을 막을 수 있습니다. 값 바인딩, 드라이버 차이와 안전한 쿼리 방식을 비교합니다.
- Newtonsoft.Json TypeNameHandling: 안전한 설정
Json.NET은 $type에서 CLR 이름을 읽습니다. 신뢰할 수 없는 JSON에는 None을 사용하고, 그 외에는 엄격한 binder로 형식을 검증하세요.
- Next.js Server Actions CSRF: Origin 및 안전한 설정
Next.js의 Origin 검사, 프록시와 allowedOrigins 신뢰 위험, 각 액션의 권한 확인 방법을 설명합니다.
- Serverless 상태 누출: 사용자 데이터를 요청별로 분리
재사용되는 serverless runtime이 오래된 사용자 데이터를 노출하는 조건과 요청별로 신원과 상태를 분리하는 방법을 설명합니다.
- NHibernate는 SQL Injection을 막을 수 있나요?
NHibernate HQL 매개변수는 값을 구문과 분리합니다. 문자열 보간과 동적 식별자에 남는 위험을 알아봅니다.
- Node.js exec()의 명령 주입 위험
Node.js exec()는 shell을 실행합니다. 신뢰할 수 없는 입력이 명령 주입으로 이어지는 조건과 execFile() 검증 방식을 알아보세요.
- 매개변수화 쿼리란 무엇인가
매개변수화 쿼리란 무엇인가: 매개변수화 쿼리는 편지 전체를 손으로 쓰는 대신 라벨이 붙은 빈칸이 있는 양식을 채우는 것과 같습니다. 데이터베이스는 먼
- Prisma $queryRaw는 SQL Injection에 안전한가요?
Prisma는 tagged template 값을 매개변수화합니다. raw 쿼리가 안전한 조건과 SQL 식별자에 allowlist가 필요한 이유를 알아봅니다.
- Rails where() 문자열 보간은 안전할까요?
where()에 요청 데이터를 보간하면 SQL Injection이 발생할 수 있습니다. 해시 조건이나 바인딩 매개변수를 사용하세요.
- AI 에이전트 도구 보안과 격리
사용자별 권한 부여, 고영향 작업 승인, 격리 실행으로 AI 에이전트 도구를 보호합니다. 샌드박스와 네트워크의 한계를 설명합니다.
- Sequelize query()는 SQL Injection에 안전한가요?
Sequelize raw 쿼리는 값을 별도로 전달해야 합니다. replacements, bind, SQL 식별자의 차이를 알아봅니다.
- SQLAlchemy text()는 SQL Injection에 안전한가요?
SQLAlchemy text()는 raw SQL을 받습니다. execute()에 값을 바인딩하고 문자열 보간 및 동적 식별자 위험을 검토하세요.
- SSRF와 클라우드 메타데이터: 자격 증명 위험과 방어
SSRF가 클라우드 메타데이터에 접근하는 방식, 자격 증명이 노출될 수 있는 조건, 공급자 제어·최소 권한·아웃바운드 규칙으로 위험을 줄이는 방법을 설명합니다.
- Svelte는 기본적으로 XSS를 막을까?
Svelte는 일반 텍스트 표현식을 이스케이프합니다. {@html}에 신뢰할 수 있거나 정제된 HTML이 필요한 이유와 사용 위치를 확인하는 방법을 설명합니다.
- TypeORM QueryBuilder는 SQL Injection에 안전한가요?
TypeORM은 QueryBuilder 매개변수를 바인딩합니다. 보간 조건, raw SQL, 동적 식별자를 검토해야 하는 이유를 알아봅니다.
- Vue v-html XSS 위험과 안전한 사용법
Vue는 기본적으로 {{ }} 텍스트를 이스케이프하지만 v-html은 원시 HTML을 렌더링합니다. XSS 경계, 리치 텍스트 처리, .vue 감사 방법을 알아보세요.
- Cosign GHSA-fx35-mq7g-6g98: Bundle 검증 우회
Cosign 레거시 Bundle의 ID 검사 우회 방식, 수정 버전, CI Blob 검증 강화 방법을 설명합니다.
- MongoDB NoSQL Injection: 안전한 쿼리 필터
검증되지 않은 JSON 객체가 MongoDB 필터를 바꾸는 방식, 유형 검증과 수정 확인 방법을 알아보세요.
- 숫자 ID도 문자열 포맷팅으로 SQL Injection이 발생할 수 있나요?
숫자 ID도 문자열 포맷팅으로 쿼리에 넣으면 위험합니다. 이유를 이해하고 매개변수화 쿼리를 사용하세요.
- Object.assign()과 Prototype Pollution: 무엇이 안전한가요?
Object.assign()은 __proto__를 통해 대상의 프로토타입을 바꿀 수 있습니다. spread와의 차이와 깊은 병합 방어법을 알아보세요.
- Node.js path.join()은 Path Traversal을 막지 못합니다
path.join()은 경로를 정규화하지만 ..을 허용합니다. 경로 포함 여부를 확인하고 심볼릭 링크는 별도로 다루세요.
- PHP include()와 사용자 제어 경로
include() 경로 제어로 파일 노출이나 코드 실행이 발생하는 조건과 고정 허용 목록 대책을 설명합니다。
- PHP ==와 Magic Hash 비교
PHP 8에서도 두 숫자 문자열은 숫자로 비교되므로 0e 해시가 일치할 수 있습니다. 입력 유형을 검증하고 비밀값에는 hash_equals()를 사용하세요.
- PHP unserialize()와 신뢰할 수 없는 입력
PHP는 allowed_classes를 설정해도 신뢰할 수 없는 데이터에 unserialize()를 사용하지 말라고 경고합니다. JSON을 사용하고 신뢰 데이터는 파싱 전에 인증하세요.
- Python os.path.join() 경로 탐색 수정
os.path.join()의 절대 경로와 .. 처리를 알아보고, 경로를 해석해 commonpath()로 범위를 확인하세요.
- Python pickle.load(): 신뢰할 수 없는 데이터 위험
Python pickle은 데이터를 읽을 때 코드를 실행할 수 있습니다. CWE-502와 검증된 JSON 대안을 확인하세요.
- Python XML XXE 보안: ElementTree, Expat, lxml
ElementTree가 XXE를 막을까요? Expat 버전 위험, lxml 설정, 신뢰할 수 없는 XML의 안전한 처리법을 확인하세요.
- ReDoS(치명적 백트래킹)란 무엇인가요?
모호한 정규식이 서비스 거부를 일으키는 방식과 매칭 비용을 안전하게 제한하는 방법을 설명합니다.
- Ruby YAML.load는 안전한가요? Psych 버전과 safe_load
Psych 버전을 확인하고 safe_load를 사용하세요. 신뢰할 수 없는 YAML이나 Marshal 데이터는 안전하지 않은 API로 역직렬화하지 마세요.
- Rust의 unsafe 블록은 메모리 안전한가요?
Rust의 unsafe 코드가 메모리 불변식을 깨뜨리는 방식, Iterator::size_hint가 안전성을 보장하지 않는 이유, 경계 밖 쓰기를 막는 방법을 설명합니다.
- SameSite=Strict가 CSRF 토큰을 대체하나요?
SameSite=Strict와 Lax의 보호 범위, 하위 도메인 간 한계, CSRF 토큰을 함께 써야 하는 경우를 설명합니다.
- sqlx의 컴파일 시 쿼리 검사가 SQL 인젝션을 막나요?
query!의 검사 범위, 바인딩 매개변수의 SQL 인젝션 방지 방식, query().bind()가 안전한 조건을 설명합니다.
- 서버 사이드 템플릿 인젝션이란?
SSTI의 발생 방식, 영향이 엔진에 따라 달라지는 이유, 신뢰할 수 없는 데이터를 템플릿 코드와 분리하는 방법을 설명합니다.
- 저장 프로시저는 SQL 인젝션을 막나요?
저장 프로시저는 바인딩 매개변수를 사용할 때만 SQL 인젝션을 막습니다. 동적 SQL과 식별자를 안전하게 다루는 방법을 설명합니다.
- SVG 업로드는 XSS 위험이 있나요?
SVG 스크립트의 실행 조건과 업로드 파일을 정화·래스터화·격리하는 방법을 설명합니다.
- WKWebView loadHTMLString은 신뢰할 수 없는 콘텐츠에 안전한가요?
WKWebView는 스크립트가 포함된 HTML을 렌더링합니다. 콘텐츠 정제와 네이티브 브리지 보호 방법을 알아보세요.
- 반사형·저장형·DOM 기반 XSS는 어떻게 다른가요?
세 가지 XSS 경로를 비교하고 각 문제를 안전한 렌더링 지점에서 수정하는 방법을 설명합니다.
- Zip Slip 취약점이란?
ZIP 내부의 조작된 파일명이 압축 해제 디렉터리를 벗어나는 방식과 각 경로를 안전하게 검증하는 방법을 설명합니다.