vibescan-cli 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vibescan_cli-0.1.0/.claude/settings.local.json +18 -0
- vibescan_cli-0.1.0/.gitignore +40 -0
- vibescan_cli-0.1.0/PKG-INFO +220 -0
- vibescan_cli-0.1.0/README.md +196 -0
- vibescan_cli-0.1.0/docs/ARCHITECTURE.md +271 -0
- vibescan_cli-0.1.0/docs/DIRECTORY_STRUCTURE.md +124 -0
- vibescan_cli-0.1.0/docs/PRD.md +384 -0
- vibescan_cli-0.1.0/pyproject.toml +45 -0
- vibescan_cli-0.1.0/src/vibescan/__init__.py +3 -0
- vibescan_cli-0.1.0/src/vibescan/__main__.py +5 -0
- vibescan_cli-0.1.0/src/vibescan/aggregator/__init__.py +0 -0
- vibescan_cli-0.1.0/src/vibescan/cli.py +85 -0
- vibescan_cli-0.1.0/src/vibescan/collector/__init__.py +4 -0
- vibescan_cli-0.1.0/src/vibescan/collector/context.py +19 -0
- vibescan_cli-0.1.0/src/vibescan/collector/file_collector.py +90 -0
- vibescan_cli-0.1.0/src/vibescan/collector/gitignore_parser.py +24 -0
- vibescan_cli-0.1.0/src/vibescan/models/__init__.py +4 -0
- vibescan_cli-0.1.0/src/vibescan/models/issue.py +45 -0
- vibescan_cli-0.1.0/src/vibescan/models/scan_result.py +27 -0
- vibescan_cli-0.1.0/src/vibescan/reporters/__init__.py +0 -0
- vibescan_cli-0.1.0/src/vibescan/reporters/console.py +89 -0
- vibescan_cli-0.1.0/src/vibescan/rules/__init__.py +4 -0
- vibescan_cli-0.1.0/src/vibescan/rules/base.py +14 -0
- vibescan_cli-0.1.0/src/vibescan/rules/dangerous_patterns.py +296 -0
- vibescan_cli-0.1.0/src/vibescan/rules/git_hygiene.py +175 -0
- vibescan_cli-0.1.0/src/vibescan/rules/registry.py +44 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/__init__.py +0 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/cicd_pipeline.py +67 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/cloud_credentials.py +69 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/config_hardcode.py +65 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/data_files.py +84 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/doc_secrets.py +69 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/docker_infra.py +75 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/editor_remnants.py +91 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/env_exposure.py +57 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/frontend_env.py +75 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/hardcoded_patterns.py +108 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/ide_settings.py +82 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/mobile_files.py +57 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/private_keys.py +67 -0
- vibescan_cli-0.1.0/src/vibescan/rules/secret/system_configs.py +71 -0
- vibescan_cli-0.1.0/src/vibescan/rules/structure.py +168 -0
- vibescan_cli-0.1.0/src/vibescan/templates/.gitkeep +0 -0
- vibescan_cli-0.1.0/tests/__init__.py +0 -0
- vibescan_cli-0.1.0/tests/conftest.py +44 -0
- vibescan_cli-0.1.0/tests/test_aggregator.py +63 -0
- vibescan_cli-0.1.0/tests/test_cli.py +71 -0
- vibescan_cli-0.1.0/tests/test_collector/__init__.py +0 -0
- vibescan_cli-0.1.0/tests/test_collector/test_file_collector.py +137 -0
- vibescan_cli-0.1.0/tests/test_collector/test_gitignore_parser.py +50 -0
- vibescan_cli-0.1.0/tests/test_models.py +110 -0
- vibescan_cli-0.1.0/tests/test_reporters.py +98 -0
- vibescan_cli-0.1.0/tests/test_rules/__init__.py +0 -0
- vibescan_cli-0.1.0/tests/test_rules/test_dangerous_patterns.py +203 -0
- vibescan_cli-0.1.0/tests/test_rules/test_git_hygiene.py +108 -0
- vibescan_cli-0.1.0/tests/test_rules/test_secret_rules.py +490 -0
- vibescan_cli-0.1.0/tests/test_rules/test_structure.py +150 -0
- vibescan_cli-0.1.0/website/index.html +505 -0
- vibescan_cli-0.1.0/website/vibescan-website-v3.jsx +450 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(pip install:*)",
|
|
5
|
+
"Bash(vibescan /tmp/test-project)",
|
|
6
|
+
"Bash(vibescan /tmp/leaky-project 2>&1)",
|
|
7
|
+
"Bash(vibescan /tmp/full-test 2>&1)",
|
|
8
|
+
"Bash(python -m pytest tests/ -v --tb=short 2>&1)",
|
|
9
|
+
"Bash(python3 -m pytest tests/ -v --tb=short 2>&1)",
|
|
10
|
+
"Bash(git -C /home/calme/vibescan status)",
|
|
11
|
+
"Bash(git -C /home/calme/vibescan log --oneline)",
|
|
12
|
+
"Bash(vibescan /home/calme/vibescan --min-severity medium 2>&1)",
|
|
13
|
+
"Bash(git -C /home/calme/vibescan log --oneline -5)",
|
|
14
|
+
"Bash(python3 -m pytest tests/test_rules/test_secret_rules.py::TestHardcodedPatterns::test_detects_api_key_prefixes -v --tb=short 2>&1)",
|
|
15
|
+
"Bash(curl -sk https://vibescan.calmee.store --resolve vibescan.calmee.store:443:127.0.0.1 2>/dev/null | head -5)"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
*.egg
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
*.whl
|
|
10
|
+
.eggs/
|
|
11
|
+
|
|
12
|
+
# Virtual environments
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
env/
|
|
16
|
+
|
|
17
|
+
# Testing / Coverage
|
|
18
|
+
.pytest_cache/
|
|
19
|
+
.coverage
|
|
20
|
+
htmlcov/
|
|
21
|
+
.tox/
|
|
22
|
+
.mypy_cache/
|
|
23
|
+
|
|
24
|
+
# IDE
|
|
25
|
+
.vscode/
|
|
26
|
+
.idea/
|
|
27
|
+
*.swp
|
|
28
|
+
*.swo
|
|
29
|
+
|
|
30
|
+
# OS
|
|
31
|
+
.DS_Store
|
|
32
|
+
Thumbs.db
|
|
33
|
+
|
|
34
|
+
# Environment / Secrets
|
|
35
|
+
.env
|
|
36
|
+
.env.*
|
|
37
|
+
!.env.example
|
|
38
|
+
|
|
39
|
+
# Distribution
|
|
40
|
+
*.tar.gz
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vibescan-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Scan your vibe-coded project for leaked secrets and security issues
|
|
5
|
+
Author: VibeScan Team
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: cli,scanner,secrets,security
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Environment :: Console
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Topic :: Security
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Requires-Dist: rich>=13.0.0
|
|
19
|
+
Requires-Dist: typer>=0.9.0
|
|
20
|
+
Provides-Extra: dev
|
|
21
|
+
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
22
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# 🛡️ VibeScan
|
|
26
|
+
|
|
27
|
+
**Push 전에, 코드를 점검하세요.**
|
|
28
|
+
|
|
29
|
+
VibeScan은 바이브코딩(AI 기반 코딩) 시대에 맞춘 **로컬 코드 보안 점검 도구**입니다.
|
|
30
|
+
민감정보 노출, 보안 취약점, 설정 실수를 초보자도 이해할 수 있는 설명형 리포트로 제공합니다.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install vibescan
|
|
34
|
+
vibescan scan ./my-project
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
> **Your code never leaves your machine.** VibeScan runs entirely locally.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 왜 VibeScan인가
|
|
42
|
+
|
|
43
|
+
AI가 만들어준 코드를 그대로 push하면 이런 일이 생깁니다.
|
|
44
|
+
|
|
45
|
+
- `.env`에 실제 API 키가 들어간 채로 GitHub에 올라감
|
|
46
|
+
- `docker-compose.yml`에 DB 비밀번호가 평문으로 노출
|
|
47
|
+
- `serviceAccountKey.json`이 프로젝트 루트에 방치
|
|
48
|
+
- `NEXT_PUBLIC_SECRET_KEY` 같은 환경변수가 브라우저에 노출
|
|
49
|
+
|
|
50
|
+
기존 보안 도구는 경고 메시지가 어렵고, 수정 방법도 알려주지 않습니다.
|
|
51
|
+
VibeScan은 **왜 위험한지**, **어떻게 고치는지**까지 안내합니다.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 주요 기능
|
|
56
|
+
|
|
57
|
+
### 🔐 Secret 탐지 (14개 카테고리)
|
|
58
|
+
|
|
59
|
+
| 카테고리 | 예시 |
|
|
60
|
+
|---------|------|
|
|
61
|
+
| 환경변수 파일 | `.env`, `.env.production` 노출 |
|
|
62
|
+
| 설정 파일 하드코딩 | `config.py`, `application.yml`의 비밀번호 |
|
|
63
|
+
| 클라우드 인증 파일 | `serviceAccountKey.json`, `terraform.tfstate` |
|
|
64
|
+
| Docker/인프라 | `docker-compose.yml`의 평문 비밀번호 |
|
|
65
|
+
| CI/CD 파이프라인 | GitHub Actions yml에 시크릿 직접 입력 |
|
|
66
|
+
| IDE 설정 | `.npmrc`, `.vscode/launch.json`의 토큰 |
|
|
67
|
+
| SSH 키/인증서 | `*.pem`, `*.key`, `*.jks` |
|
|
68
|
+
| 코드 내 하드코딩 | `sk-`, `AKIA`, `ghp_` 패턴, DB 연결 문자열 |
|
|
69
|
+
| 프론트엔드 환경변수 | `NEXT_PUBLIC_`, `VITE_` + 시크릿 조합 |
|
|
70
|
+
| 데이터 파일 | `.sqlite`, `.sql`, Jupyter Notebook 출력 |
|
|
71
|
+
| 문서 내 실수 | README curl 예시에 실제 토큰 |
|
|
72
|
+
| 모바일 앱 파일 | `AndroidManifest.xml`, `Info.plist`의 API 키 |
|
|
73
|
+
| DB/시스템 설정 | `.pgpass`, `.kube/config` |
|
|
74
|
+
| 에디터 잔여물 | `.bash_history`, `.htaccess`, Vim swap |
|
|
75
|
+
|
|
76
|
+
### ⚠️ 위험 코드 패턴
|
|
77
|
+
|
|
78
|
+
**Python:** `eval()`, `exec()`, `subprocess(shell=True)`, `pickle.loads()`, `DEBUG=True`, `verify=False`
|
|
79
|
+
**JS/TS:** `eval()`, `innerHTML`, `dangerouslySetInnerHTML`, `child_process.exec()`, `jwt.decode` without verify
|
|
80
|
+
**SQL:** f-string/template literal 쿼리 조합 (인젝션)
|
|
81
|
+
|
|
82
|
+
### 📋 Git Hygiene
|
|
83
|
+
|
|
84
|
+
`.gitignore` 존재 여부, `.env*` / `*.pem` / `*.key` / `terraform.tfstate` 등의 ignore 등록 여부 검사
|
|
85
|
+
|
|
86
|
+
### 🏗️ 프로젝트 구조
|
|
87
|
+
|
|
88
|
+
README, `.env.example`, 테스트 파일, 라이선스, 의존성 버전 고정 검사
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 사용법
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# 기본 스캔 (콘솔 출력)
|
|
96
|
+
vibescan scan ./project
|
|
97
|
+
|
|
98
|
+
# HTML 리포트 생성
|
|
99
|
+
vibescan scan ./project --html report.html
|
|
100
|
+
|
|
101
|
+
# JSON 리포트 생성 (CI/CD 연동)
|
|
102
|
+
vibescan scan ./project --json report.json
|
|
103
|
+
|
|
104
|
+
# MEDIUM 이상만 표시
|
|
105
|
+
vibescan scan ./project --min-severity medium
|
|
106
|
+
|
|
107
|
+
# 특정 규칙 제외
|
|
108
|
+
vibescan scan ./project --ignore-rule SEC001
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 출력 예시
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
🔍 Scanning 147 files...
|
|
117
|
+
|
|
118
|
+
CRITICAL config.py:23 Hardcoded AWS access key detected (AKIA...)
|
|
119
|
+
CRITICAL docker-compose.yml:8 POSTGRES_PASSWORD in plaintext
|
|
120
|
+
HIGH src/api.js:45 API key hardcoded: sk-proj-...
|
|
121
|
+
HIGH .env not in .gitignore
|
|
122
|
+
MEDIUM settings.py:1 DEBUG = True (production risk)
|
|
123
|
+
MEDIUM app.js:12 cors({ origin: '*' }) allows all domains
|
|
124
|
+
LOW No README.md found
|
|
125
|
+
|
|
126
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
127
|
+
Scanned 147 files • Found 7 issues
|
|
128
|
+
CRITICAL: 2 HIGH: 2 MEDIUM: 2 LOW: 1
|
|
129
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 심각도 체계
|
|
135
|
+
|
|
136
|
+
| 등급 | 기준 | 예시 |
|
|
137
|
+
|------|------|------|
|
|
138
|
+
| **CRITICAL** | 즉시 악용 가능, 금전적 피해 | AWS 키, DB 비밀번호, 서비스 계정 키 |
|
|
139
|
+
| **HIGH** | 보안 취약점, 공격 경로 | API 키 하드코딩, eval(), SQL 인젝션 |
|
|
140
|
+
| **MEDIUM** | 잠재적 위험, 모범 사례 위반 | DEBUG=True, CORS 전체 허용 |
|
|
141
|
+
| **LOW** | 코드 품질, 유지보수성 | README 부재, TODO 잔존 |
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 아키텍처
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
CLI Parser → Config Loader → File Collector → Rule Engine → Aggregator → Reporter
|
|
149
|
+
│
|
|
150
|
+
ProjectContext
|
|
151
|
+
(텍스트 파일, 전체 목록,
|
|
152
|
+
.gitignore 패턴)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- **100% 로컬** — 네트워크 통신 없음, 오프라인 동작
|
|
156
|
+
- **플러그인 구조** — 규칙 추가 시 새 클래스만 작성
|
|
157
|
+
- **안전 설계** — 심볼릭 링크 건너뛰기, 인코딩 안전 처리, 대용량 파일 보호
|
|
158
|
+
- **CI/CD 호환** — CRITICAL/HIGH 발견 시 exit code 1 반환
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 기술 스택
|
|
163
|
+
|
|
164
|
+
| 구분 | 선택 |
|
|
165
|
+
|------|------|
|
|
166
|
+
| 언어 | Python 3.10+ |
|
|
167
|
+
| CLI | typer |
|
|
168
|
+
| 콘솔 출력 | rich |
|
|
169
|
+
| 패턴 탐지 | regex (re), ast |
|
|
170
|
+
| HTML 리포트 | Jinja2 |
|
|
171
|
+
| 패키지 배포 | PyPI |
|
|
172
|
+
| 테스트 | pytest |
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 로드맵
|
|
177
|
+
|
|
178
|
+
- [x] PRD 작성
|
|
179
|
+
- [x] 아키텍처 설계
|
|
180
|
+
- [x] MVP 구현 (File Collector + Secret Rule + Console Reporter)
|
|
181
|
+
- [x] Git Hygiene / Dangerous Pattern / Structure Rule
|
|
182
|
+
- [x] 테스트 (196 tests passing)
|
|
183
|
+
- [ ] JSON / HTML Reporter
|
|
184
|
+
- [ ] PyPI 배포
|
|
185
|
+
- [ ] 소개 웹사이트
|
|
186
|
+
- [ ] Git History Scan
|
|
187
|
+
- [ ] VSCode Extension
|
|
188
|
+
- [ ] GitHub Actions 연동
|
|
189
|
+
- [ ] AI 기반 코드 설명
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 보안 원칙
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
Your code never leaves your machine.
|
|
197
|
+
VibeScan runs entirely locally.
|
|
198
|
+
No network. No upload. No tracking.
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 라이선스
|
|
204
|
+
|
|
205
|
+
MIT License
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 관련 문서
|
|
210
|
+
|
|
211
|
+
- [PRD (Product Requirements Document)](./docs/PRD.md)
|
|
212
|
+
- [Architecture Design](./docs/ARCHITECTURE.md)
|
|
213
|
+
- [Directory Structure](./docs/DIRECTORY_STRUCTURE.md)
|
|
214
|
+
- [탐지 규칙 문서](./docs/rules.md)
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 개발 블로그
|
|
219
|
+
|
|
220
|
+
- [VibeScan 개발기 — 바이브코더를 위한 보안 점검 도구를 만듭니다](https://calme.tistory.com)
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# 🛡️ VibeScan
|
|
2
|
+
|
|
3
|
+
**Push 전에, 코드를 점검하세요.**
|
|
4
|
+
|
|
5
|
+
VibeScan은 바이브코딩(AI 기반 코딩) 시대에 맞춘 **로컬 코드 보안 점검 도구**입니다.
|
|
6
|
+
민감정보 노출, 보안 취약점, 설정 실수를 초보자도 이해할 수 있는 설명형 리포트로 제공합니다.
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
pip install vibescan
|
|
10
|
+
vibescan scan ./my-project
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
> **Your code never leaves your machine.** VibeScan runs entirely locally.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 왜 VibeScan인가
|
|
18
|
+
|
|
19
|
+
AI가 만들어준 코드를 그대로 push하면 이런 일이 생깁니다.
|
|
20
|
+
|
|
21
|
+
- `.env`에 실제 API 키가 들어간 채로 GitHub에 올라감
|
|
22
|
+
- `docker-compose.yml`에 DB 비밀번호가 평문으로 노출
|
|
23
|
+
- `serviceAccountKey.json`이 프로젝트 루트에 방치
|
|
24
|
+
- `NEXT_PUBLIC_SECRET_KEY` 같은 환경변수가 브라우저에 노출
|
|
25
|
+
|
|
26
|
+
기존 보안 도구는 경고 메시지가 어렵고, 수정 방법도 알려주지 않습니다.
|
|
27
|
+
VibeScan은 **왜 위험한지**, **어떻게 고치는지**까지 안내합니다.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 주요 기능
|
|
32
|
+
|
|
33
|
+
### 🔐 Secret 탐지 (14개 카테고리)
|
|
34
|
+
|
|
35
|
+
| 카테고리 | 예시 |
|
|
36
|
+
|---------|------|
|
|
37
|
+
| 환경변수 파일 | `.env`, `.env.production` 노출 |
|
|
38
|
+
| 설정 파일 하드코딩 | `config.py`, `application.yml`의 비밀번호 |
|
|
39
|
+
| 클라우드 인증 파일 | `serviceAccountKey.json`, `terraform.tfstate` |
|
|
40
|
+
| Docker/인프라 | `docker-compose.yml`의 평문 비밀번호 |
|
|
41
|
+
| CI/CD 파이프라인 | GitHub Actions yml에 시크릿 직접 입력 |
|
|
42
|
+
| IDE 설정 | `.npmrc`, `.vscode/launch.json`의 토큰 |
|
|
43
|
+
| SSH 키/인증서 | `*.pem`, `*.key`, `*.jks` |
|
|
44
|
+
| 코드 내 하드코딩 | `sk-`, `AKIA`, `ghp_` 패턴, DB 연결 문자열 |
|
|
45
|
+
| 프론트엔드 환경변수 | `NEXT_PUBLIC_`, `VITE_` + 시크릿 조합 |
|
|
46
|
+
| 데이터 파일 | `.sqlite`, `.sql`, Jupyter Notebook 출력 |
|
|
47
|
+
| 문서 내 실수 | README curl 예시에 실제 토큰 |
|
|
48
|
+
| 모바일 앱 파일 | `AndroidManifest.xml`, `Info.plist`의 API 키 |
|
|
49
|
+
| DB/시스템 설정 | `.pgpass`, `.kube/config` |
|
|
50
|
+
| 에디터 잔여물 | `.bash_history`, `.htaccess`, Vim swap |
|
|
51
|
+
|
|
52
|
+
### ⚠️ 위험 코드 패턴
|
|
53
|
+
|
|
54
|
+
**Python:** `eval()`, `exec()`, `subprocess(shell=True)`, `pickle.loads()`, `DEBUG=True`, `verify=False`
|
|
55
|
+
**JS/TS:** `eval()`, `innerHTML`, `dangerouslySetInnerHTML`, `child_process.exec()`, `jwt.decode` without verify
|
|
56
|
+
**SQL:** f-string/template literal 쿼리 조합 (인젝션)
|
|
57
|
+
|
|
58
|
+
### 📋 Git Hygiene
|
|
59
|
+
|
|
60
|
+
`.gitignore` 존재 여부, `.env*` / `*.pem` / `*.key` / `terraform.tfstate` 등의 ignore 등록 여부 검사
|
|
61
|
+
|
|
62
|
+
### 🏗️ 프로젝트 구조
|
|
63
|
+
|
|
64
|
+
README, `.env.example`, 테스트 파일, 라이선스, 의존성 버전 고정 검사
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 사용법
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# 기본 스캔 (콘솔 출력)
|
|
72
|
+
vibescan scan ./project
|
|
73
|
+
|
|
74
|
+
# HTML 리포트 생성
|
|
75
|
+
vibescan scan ./project --html report.html
|
|
76
|
+
|
|
77
|
+
# JSON 리포트 생성 (CI/CD 연동)
|
|
78
|
+
vibescan scan ./project --json report.json
|
|
79
|
+
|
|
80
|
+
# MEDIUM 이상만 표시
|
|
81
|
+
vibescan scan ./project --min-severity medium
|
|
82
|
+
|
|
83
|
+
# 특정 규칙 제외
|
|
84
|
+
vibescan scan ./project --ignore-rule SEC001
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 출력 예시
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
🔍 Scanning 147 files...
|
|
93
|
+
|
|
94
|
+
CRITICAL config.py:23 Hardcoded AWS access key detected (AKIA...)
|
|
95
|
+
CRITICAL docker-compose.yml:8 POSTGRES_PASSWORD in plaintext
|
|
96
|
+
HIGH src/api.js:45 API key hardcoded: sk-proj-...
|
|
97
|
+
HIGH .env not in .gitignore
|
|
98
|
+
MEDIUM settings.py:1 DEBUG = True (production risk)
|
|
99
|
+
MEDIUM app.js:12 cors({ origin: '*' }) allows all domains
|
|
100
|
+
LOW No README.md found
|
|
101
|
+
|
|
102
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
103
|
+
Scanned 147 files • Found 7 issues
|
|
104
|
+
CRITICAL: 2 HIGH: 2 MEDIUM: 2 LOW: 1
|
|
105
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 심각도 체계
|
|
111
|
+
|
|
112
|
+
| 등급 | 기준 | 예시 |
|
|
113
|
+
|------|------|------|
|
|
114
|
+
| **CRITICAL** | 즉시 악용 가능, 금전적 피해 | AWS 키, DB 비밀번호, 서비스 계정 키 |
|
|
115
|
+
| **HIGH** | 보안 취약점, 공격 경로 | API 키 하드코딩, eval(), SQL 인젝션 |
|
|
116
|
+
| **MEDIUM** | 잠재적 위험, 모범 사례 위반 | DEBUG=True, CORS 전체 허용 |
|
|
117
|
+
| **LOW** | 코드 품질, 유지보수성 | README 부재, TODO 잔존 |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 아키텍처
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
CLI Parser → Config Loader → File Collector → Rule Engine → Aggregator → Reporter
|
|
125
|
+
│
|
|
126
|
+
ProjectContext
|
|
127
|
+
(텍스트 파일, 전체 목록,
|
|
128
|
+
.gitignore 패턴)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
- **100% 로컬** — 네트워크 통신 없음, 오프라인 동작
|
|
132
|
+
- **플러그인 구조** — 규칙 추가 시 새 클래스만 작성
|
|
133
|
+
- **안전 설계** — 심볼릭 링크 건너뛰기, 인코딩 안전 처리, 대용량 파일 보호
|
|
134
|
+
- **CI/CD 호환** — CRITICAL/HIGH 발견 시 exit code 1 반환
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 기술 스택
|
|
139
|
+
|
|
140
|
+
| 구분 | 선택 |
|
|
141
|
+
|------|------|
|
|
142
|
+
| 언어 | Python 3.10+ |
|
|
143
|
+
| CLI | typer |
|
|
144
|
+
| 콘솔 출력 | rich |
|
|
145
|
+
| 패턴 탐지 | regex (re), ast |
|
|
146
|
+
| HTML 리포트 | Jinja2 |
|
|
147
|
+
| 패키지 배포 | PyPI |
|
|
148
|
+
| 테스트 | pytest |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 로드맵
|
|
153
|
+
|
|
154
|
+
- [x] PRD 작성
|
|
155
|
+
- [x] 아키텍처 설계
|
|
156
|
+
- [x] MVP 구현 (File Collector + Secret Rule + Console Reporter)
|
|
157
|
+
- [x] Git Hygiene / Dangerous Pattern / Structure Rule
|
|
158
|
+
- [x] 테스트 (196 tests passing)
|
|
159
|
+
- [ ] JSON / HTML Reporter
|
|
160
|
+
- [ ] PyPI 배포
|
|
161
|
+
- [ ] 소개 웹사이트
|
|
162
|
+
- [ ] Git History Scan
|
|
163
|
+
- [ ] VSCode Extension
|
|
164
|
+
- [ ] GitHub Actions 연동
|
|
165
|
+
- [ ] AI 기반 코드 설명
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 보안 원칙
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
Your code never leaves your machine.
|
|
173
|
+
VibeScan runs entirely locally.
|
|
174
|
+
No network. No upload. No tracking.
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 라이선스
|
|
180
|
+
|
|
181
|
+
MIT License
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 관련 문서
|
|
186
|
+
|
|
187
|
+
- [PRD (Product Requirements Document)](./docs/PRD.md)
|
|
188
|
+
- [Architecture Design](./docs/ARCHITECTURE.md)
|
|
189
|
+
- [Directory Structure](./docs/DIRECTORY_STRUCTURE.md)
|
|
190
|
+
- [탐지 규칙 문서](./docs/rules.md)
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 개발 블로그
|
|
195
|
+
|
|
196
|
+
- [VibeScan 개발기 — 바이브코더를 위한 보안 점검 도구를 만듭니다](https://calme.tistory.com)
|