Skip to content
Back to skills

Vulnerability Patterns

ASecurity

코드 취약점 패턴 데이터베이스. 언어별(Python/JS/Java/Go) 취약 코드 패턴, CWE 분류, 안전한 대안 코드, 심각도 판정 기준을 제공하는 security-analyst 확장 스킬. '취약점 패턴', 'CWE', 'SQL Injection', 'XSS', '보안 취약점', '안전한 코딩', '취약 코드' 등 보안 리뷰 시 사용한다. 단, 침투 테스트 수행이나 WAF 설정은 이 스킬의 범위가 아니다.

  • 1,256 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 29, 2026
securityjavascripttypescriptpythongojavashellsqlreactdjangoaws

Works with

  • cursor
  • api

Security analysis

A100/100

Scanned May 29, 2026

npx -y skills add revfactory/harness-100 --skill vulnerability-patterns --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Vulnerability Patterns?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Vulnerability Patterns
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/revfactory-vulnerability-patterns/badge)](https://www.skillsdirectory.com/skills/revfactory-vulnerability-patterns)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: vulnerability-patterns
description: "코드 취약점 패턴 데이터베이스. 언어별(Python/JS/Java/Go) 취약 코드 패턴, CWE 분류, 안전한 대안 코드, 심각도 판정 기준을 제공하는 security-analyst 확장 스킬. '취약점 패턴', 'CWE', 'SQL Injection', 'XSS', '보안 취약점', '안전한 코딩', '취약 코드' 등 보안 리뷰 시 사용한다. 단, 침투 테스트 수행이나 WAF 설정은 이 스킬의 범위가 아니다."
---

# Vulnerability Patterns — 코드 취약점 패턴 데이터베이스

security-analyst 에이전트가 보안 리뷰 시 활용하는 취약 코드 패턴, CWE 분류, 안전한 대안 레퍼런스.

## 대상 에이전트

`security-analyst` — 이 스킬의 취약점 패턴을 코드 보안 분석에 직접 적용한다.

## 취약점 분류 체계 (CWE Top 25)

### 최우선 검출 대상

| CWE | 이름 | 심각도 | 빈도 |
|-----|------|--------|------|
| CWE-79 | XSS (Cross-Site Scripting) | High | 매우 높음 |
| CWE-89 | SQL Injection | Critical | 높음 |
| CWE-78 | OS Command Injection | Critical | 중간 |
| CWE-22 | Path Traversal | High | 중간 |
| CWE-352 | CSRF | High | 높음 |
| CWE-798 | Hardcoded Credentials | Critical | 높음 |
| CWE-862 | Missing Authorization | Critical | 높음 |
| CWE-306 | Missing Authentication | Critical | 중간 |
| CWE-502 | Deserialization | Critical | 중간 |
| CWE-918 | SSRF | High | 중간 |

## 언어별 취약 코드 패턴

### Python

#### SQL Injection (CWE-89)
```python
# 취약
query = f"SELECT * FROM users WHERE name = '{user_input}'"
cursor.execute(query)

# 안전
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
# 또는 ORM 사용 (SQLAlchemy, Django ORM)
```

#### Command Injection (CWE-78)
```python
# 취약
os.system(f"ping {user_input}")
subprocess.call(f"ls {user_input}", shell=True)

# 안전
subprocess.run(["ping", user_input], shell=False)
# shlex.quote()로 이스케이프 (부득이한 경우)
```

#### Path Traversal (CWE-22)
```python
# 취약
file_path = os.path.join(BASE_DIR, user_input)
open(file_path).read()

# 안전
file_path = os.path.realpath(os.path.join(BASE_DIR, user_input))
if not file_path.startswith(os.path.realpath(BASE_DIR)):
    raise ValueError("Invalid path")
```

#### YAML Deserialization (CWE-502)
```python
# 취약
data = yaml.load(user_input)  # 임의 코드 실행 가능

# 안전
data = yaml.safe_load(user_input)
```

### JavaScript/TypeScript

#### XSS (CWE-79)
```javascript
// 취약 (React)
<div dangerouslySetInnerHTML={{__html: userInput}} />

// 안전
<div>{userInput}</div>  // React 자동 이스케이프
// 필요 시 DOMPurify
import DOMPurify from 'dompurify';
<div dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(userInput)}} />
```

#### Prototype Pollution (CWE-1321)
```javascript
// 취약
function merge(target, source) {
  for (let key in source) {
    target[key] = source[key];  // __proto__ 오염 가능
  }
}

// 안전
function merge(target, source) {
  for (let key of Object.keys(source)) {
    if (key === '__proto__' || key === 'constructor') continue;
    target[key] = source[key];
  }
}
// 또는 Object.create(null) 사용
```

#### ReDoS (CWE-1333)
```javascript
// 취약 (Catastrophic Backtracking)
const regex = /^(a+)+$/;
regex.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaab");  // 지수적 시간

// 안전: 비백트래킹 패턴 사용
const regex = /^a+$/;  // 중첩 반복 제거
```

#### eval/Function 실행 (CWE-95)
```javascript
// 취약
eval(userInput);
new Function(userInput)();
setTimeout(userInput, 1000);

// 안전: eval 사용 금지, 대안 로직 사용
```

### Java

#### SQL Injection (CWE-89)
```java
// 취약
String query = "SELECT * FROM users WHERE id = " + userId;
Statement stmt = conn.createStatement();
stmt.executeQuery(query);

// 안전
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
ps.setInt(1, userId);
ps.executeQuery();
```

#### XXE (CWE-611)
```java
// 취약
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
db.parse(userInput);

// 안전
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
```

#### Deserialization (CWE-502)
```java
// 취약
ObjectInputStream ois = new ObjectInputStream(userInputStream);
Object obj = ois.readObject();  // 임의 코드 실행 가능

// 안전: JSON/XML 직렬화 사용 (Jackson, Gson)
// ObjectInputFilter 사용 (Java 9+)
```

### Go

#### SQL Injection (CWE-89)
```go
// 취약
query := fmt.Sprintf("SELECT * FROM users WHERE name = '%s'", userInput)
db.Query(query)

// 안전
db.Query("SELECT * FROM users WHERE name = $1", userInput)
```

#### SSRF (CWE-918)
```go
// 취약
resp, err := http.Get(userProvidedURL)

// 안전: URL 화이트리스트 + 내부 IP 차단
parsedURL, _ := url.Parse(userProvidedURL)
if isInternalIP(parsedURL.Hostname()) {
    return errors.New("internal IP not allowed")
}
```

## 시크릿/민감정보 패턴

### 탐지 대상 패턴
| 유형 | 정규식 패턴 (간략) | 심각도 |
|------|-------------------|--------|
| AWS Access Key | `AKIA[0-9A-Z]{16}` | Critical |
| AWS Secret Key | `[A-Za-z0-9/+=]{40}` (AKIA와 함께) | Critical |
| GitHub Token | `gh[ps]_[A-Za-z0-9_]{36,}` | Critical |
| Google API Key | `AIza[0-9A-Za-z_-]{35}` | High |
| Slack Token | `xox[baprs]-[0-9a-zA-Z-]+` | High |
| JWT | `eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+` | High |
| Private Key | `-----BEGIN (RSA|EC|DSA) PRIVATE KEY-----` | Critical |
| 비밀번호 변수 | `password\s*=\s*['"][^'"]+['"]` | Critical |
| DB Connection String | `(mysql|postgresql|mongodb)://[^/\s]+` | Critical |

## 심각도 판정 매트릭스

| 요소 | Critical | High | Medium | Low |
|------|----------|------|--------|-----|
| **공격 용이성** | 네트워크, 인증 불필요 | 네트워크, 일부 조건 | 로컬, 인증 필요 | 물리적 접근 |
| **영향** | 시스템 완전 장악 | 데이터 유출 | 서비스 저하 | 정보 노출 (제한적) |
| **데이터 범위** | 전체 DB | 사용자 개인정보 | 비민감 데이터 | 공개 데이터 |
| **기밀성** | 전면 노출 | 부분 노출 | 간접 노출 | 미미 |

## 보안 리뷰 체크리스트

### 인증/인가
- [ ] 모든 엔드포인트에 인증 확인
- [ ] 객체 수준 인가 (자신의 데이터만 접근)
- [ ] 관리자 기능 권한 분리
- [ ] 비밀번호 해싱 (bcrypt/Argon2)
- [ ] Rate Limiting 적용

### 입력 처리
- [ ] 모든 입력 검증 (타입, 길이, 범위)
- [ ] SQL 파라미터 바인딩 (ORM 또는 Prepared Statement)
- [ ] HTML/JS 출력 이스케이핑
- [ ] 파일 업로드 타입/크기 제한
- [ ] URL/경로 입력 검증

### 데이터 보호
- [ ] 민감 데이터 암호화 (저장/전송)
- [ ] 로그에 민감 정보 미포함
- [ ] 에러 응답에 내부 정보 미노출
- [ ] HTTPS 강제
- [ ] 보안 헤더 설정

### 의존성
- [ ] 알려진 CVE 없는 버전
- [ ] 불필요한 의존성 제거
- [ ] 라이선스 호환성 확인

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…