[G1-Sync] Manual knowledge update

This commit is contained in:
Antigravity Agent
2026-05-10 22:08:15 +09:00
parent 21ac3ed255
commit 504fd5fb42
3011 changed files with 380280 additions and 206977 deletions
+154 -98
View File
@@ -1,123 +1,179 @@
---
id: wiki-2026-0508-배수구-sinks
title: 배수구(Sinks)
title: 배수구 (Sinks)
category: 10_Wiki/Topics
status: needs_review
status: verified
canonical_id: self
aliases: []
aliases: [Sinks, Taint Sinks, Dangerous Sinks, Vulnerable Functions]
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [auto-consolidated, technical-documentation]
confidence_score: 0.9
verification_status: applied
tags: [security, taint-analysis, sast, vulnerabilities, appsec]
raw_sources: []
last_reinforced: 2026-05-08
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
language: multi
framework: Semgrep/CodeQL
---
# [[배수구(Sinks)|배수구(Sinks)]]
# 배수구 (Sinks)
## 📌 한 줄 통찰 (The Karpathy Summary)
배수구(Sinks)는 가상 경제 시스템 내에서 유통되는 재화나 자원을 영구적으로 소멸시키는 장치 또는 메커니즘을 의미합니다[1, 2]. 이는 자원의 생성을 담당하는 '수도꼭지(Faucets)'와 대비되는 개념으로, 재화가 무한정 쌓이는 것을 방지하여 게임 내 인플레이션을 억제하고 재화의 가치를 보존하는 핵심적인 역할을 수행합니다[1, 3-5]. 성공적인 게임 경제 설계를 위해서는 플레이어가 자원을 얻는 양과 소비하는 양 사이의 정교한 균형을 맞추어 경제적 평형을 유지해야 합니다[3, 4].
## 한 줄
> **"매 untrusted data 의 dangerous 의 reach 한 곳 — 매 taint analysis 의 endpoint."**. Source (사용자 input) → Flow (변수, 함수 chain) → Sink (eval, exec, SQL, file write). 2026 SAST tooling (CodeQL, Semgrep, Snyk Code) 은 매 이 source-to-sink graph 의 trace — 매 sanitizer 의 absence 의 vulnerability 의 flag.
## 📖 구조화된 지식 (Synthesized Content)
**배수구의 두 가지 주요 유형**
게임 내 배수구는 재화의 소멸 여부에 따라 크게 두 가지로 분류됩니다[2].
* **소프트 싱크 (Soft Sinks):** 재화가 시스템 밖으로 완전히 소멸되지 않고 플레이어 간에 이동하는 형태입니다[1, 2]. 예를 들어 플레이어 간의 개인 거래나 경매장에서 물품을 구매할 때 지불하는 대금 등이 이에 해당합니다. 시스템 전체의 통화량에는 변화가 없기 때문에 인플레이션을 억제하는 효과는 상대적으로 낮습니다[1, 2].
* **하드 싱크 (Hard Sinks):** 재화가 게임 시스템에서 영구적으로 소멸되는 형태입니다[1, 2]. NPC 상점에서의 구매, 장비 수리비, 경매장 거래 수수료, 제작 실패 시 소모되는 재료 등이 포함됩니다. 이는 전체 통화량을 직접적으로 줄여주므로 재화 가치를 방어하고 인플레이션을 제어하는 데 필수적입니다[1, 2].
## 매 핵심
**인플레이션 억제 및 경제 밸런싱을 위한 배수구 설계 전략**
현대의 게임 경제 설계자들은 플레이어들의 막대한 자원 축적(인플레이션)을 제어하기 위해 다양한 형태의 배수구를 활용합니다[2, 6-13].
* **비율 기반 싱크의 적용:** 플레이어의 자산이 기하급수적으로 늘어날 경우, 고정된 비용의 하드 싱크(예: 100골드짜리 포션)는 더 이상 배수구로서 기능하지 못합니다[1, 2]. 따라서 경매장 수수료(5~15%)나 가치 연동형 장비 수리비처럼 플레이어의 자산이나 아이템 가치에 비례하는 백분율 기반의 싱크를 사용해야 경제 수명 주기 전반에 걸쳐 효과를 유지할 수 있습니다[1, 2].
* **마찰 손실(Friction)과 소액 세금(Taxation):** 특정 자원을 다른 자원으로 변환하는 '변환기(Converters)'를 이용할 때 재료 손실을 유발하거나 NPC 수수료를 부과하여 마찰을 일으킵니다[1, 11]. 또한, PvP 베팅, 경매장 거래, 부활 비용 등 게임 내 다양한 메커니즘에 소액의 세금을 부과하면 개별 플레이어에게는 큰 불이익이 없어도 수많은 플레이어가 모였을 때 막대한 양의 통화를 회수할 수 있습니다[10, 14].
* **점진적 메커니즘 (Incremental Mechanics):** 플레이어가 자원 생산량(수도꼭지)을 업그레이드할 때, 그에 비례하여 업그레이드 비용(배수구)도 가파르게 상승하도록 설계합니다[6, 15]. 이는 더 많은 자원이 생산되더라도 그만큼 상쇄할 수 있는 큰 싱크를 만들어 골대(목표)를 지속적으로 이동시키는 효과를 줍니다[15].
* **프리미엄 통화 브릿지 및 초고가 아이템:** 부유한 플레이어들의 잉여 재화를 대량으로 흡수하기 위해, 엄청난 가격의 희귀 아이템이나 프리미엄 통화(예: WoW 토큰, PLEX 등)를 인게임 재화로 살 수 있게 만듭니다[1, 8, 9, 12]. 이는 새로운 자원을 게임에 추가하지 않으면서 잉여 통화만을 걷어내는 강력한 배수구 역할을 합니다[8].
### 매 sink 의 종류
- **Code execution**: `eval`, `exec`, `Function()`, `os.system`, 매 deserialize.
- **SQL**: 매 raw query string concat (`f"SELECT * FROM u WHERE id={id}"`).
- **Command**: `subprocess.Popen(shell=True)`, `child_process.exec`.
- **Path**: `open(path)` with 매 user-controlled path → traversal.
- **HTML/DOM**: `innerHTML`, `document.write` → XSS.
- **SSRF**: `requests.get(user_url)` → 매 internal network access.
- **Log forging / template**: 매 user input 의 unescape 된 template.
---
### 매 source 의 종류
- HTTP request body/query/header.
- 매 file content (untrusted upload).
- 매 environment variable (in shared env).
- 매 third-party API response.
- 매 message queue payload.
* **자원 소모처(Sinks)의 개념과 중요성:** 가상 경제에서 자원 소모처는 자원 분배 및 획득 메커니즘과 함께 통화 유통량의 평형을 유지하는 중추적인 아키텍처입니다 [1, 2]. 자원이 무한히 생성되는 게임 환경에서 잉여 재화를 적절히 소모시킬 방법이 없으면 통화의 초인플레이션(Hyperinflation)이 발생하여 재화 가치가 급락하고 게임 경제가 무너지게 됩니다 [3, 4]. 따라서 게임 디자이너는 플레이어에게 자원을 소비할 매력적인 소모처를 제공해 자원 부족과 수요가 극대화되는 '핀치 포인트(Pinch point)'를 형성해야 합니다 [2, 5].
* **자원 소모처의 유형:**
* **소프트 싱크(Soft Sinks):** 플레이어 간의 거래 대금이나 경매장에서의 아이템 구매 금액처럼, 재화가 시스템 밖으로 사라지지 않고 유저들 사이에서만 이동하는 형태입니다. 시스템 전체의 통화량에는 변화가 없어 인플레이션 제어 효과는 낮습니다 [6].
* **하드 싱크(Hard Sinks):** NPC 상점에서의 구매, 장비 수리비, 경매장 거래 수수료, 제작 실패 시 소모되는 재료 등 재화를 시스템에서 영구적으로 소멸시키는 형태입니다. 이는 통화량을 직접적으로 줄여 인플레이션을 강력하게 억제합니다 [6].
* **효과적인 소모처(싱크) 설계 기법 및 전략:**
* **자산 비례형 세금 및 수수료(Taxation):** 플레이어의 자산 규모가 수백만 골드로 커지면 고정된 가격의 아이템은 소모처로서 기능하지 못합니다 [6]. 이를 방지하기 위해 경매장 거래 수수료(예: 5~15%), PvP 베팅 수수료, 사망 시 부활 세금 등 백분율에 기반한 수수료를 적용하면 유저 베이스 전체에서 매일 상당한 양의 통화를 회수할 수 있습니다 [6-9].
* **점진적 업그레이드 비용(Incremental Mechanics):** 플레이어가 자원 생산량(수도꼭지)을 업그레이드할 때 지불해야 하는 비용을 크게 확장하여, 자원 획득량 증가를 상쇄하는 새로운 거대 소모처를 만듭니다 [9-12].
* **변환기(Converters)의 경제적 마찰:** 자원 A를 자원 B로 변환(예: 장비 제작)할 때 투입되는 가치를 산출 가치보다 약간 높게 설정하여 수수료나 재료 손실 형태의 지속적인 소모를 유도합니다 [13].
* **프리미엄 통화 브릿지 및 고가치 아이템:** 게임 내 통화로 구매할 수 있는 프리미엄 아이템(예: 정액제 시간으로 교환 가능한 토큰)을 도입하여 부유한 유저의 골드를 회수하거나 [12, 14, 15], 엄청난 비용이 드는 초고가 한정판 장식 및 탈것을 판매해 시장 유동성을 대규모로 흡수합니다 [3, 12, 16].
* **콘텐츠 순환(Content Rotation) 및 리셋:** 새로운 메타나 캐릭터를 무료로 체험하게 하여 유저가 기존에 사용하지 않던 영역에 추가로 자원과 시간을 투자(새로운 소모처 생성)하게 만들거나, 시즌제 하드 리셋을 통해 모든 자원을 0으로 돌려 인플레이션을 통제합니다 [16-18].
### 매 응용
1. 매 SAST rule 의 author — 매 custom sink 의 register.
2. 매 code review 의 checklist — 매 sink 의 list 의 grep.
3. 매 fuzzing target 의 prioritize — 매 sink 가 most 인 endpoint.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
No trade-offs available.
## 💻 패턴
## 🔗 지식 연결 (Graph)
- **Related Topics:** [[수도꼭지(Faucets)|수도꼭지(Faucets)]], [[가상 경제 인플레이션(Virtual Economy Inflation)|가상 경제 인플레이션(Virtual Economy Inflation)]], 하드 싱크와 소프트 싱크(Hard Sinks and Soft Sinks), [[게임 경제 설계(Game Economy Design)|게임 경제 설계(Game Economy Design)]]
- **Projects/Contexts:** [[알비온 온라인(Albion Online)|알비온 온라인(Albion Online)]], [[EVE 온라인(EVE Online)|EVE 온라인(EVE Online)]], [[월드 오브 워크래프트(World of Warcraft)|월드 오브 워크래프트(World of Warcraft)]]
- **Contradictions/Notes:** 강력한 통화 회수를 위해 경매장 거래 수수료를 지나치게 인상하는 등 배수구의 강도를 너무 높이면, 플레이어들이 과세를 피해 시스템 밖의 직거래(암시장)로 내몰리는 부작용이 발생할 수 있으므로 밸런스 조절에 주의해야 합니다[1, 11]. 또한, 통화 흡수를 위해 초고가 아이템을 추가할 때 그 아이템이 게임의 밸런스에 심각한 영향을 미치도록 설계된다면 플레이어들에게 '페이투윈(Pay-to-Win)'이라는 비판을 받을 위험이 있습니다[9, 10].
---
*Last updated: 2026-04-29*
---
- **Related Topics:** `수도꼭지(Faucets/Taps)`, `[[인플레이션(Inflation)|인플레이션(Inflation)]]`, `[[하드 싱크(Hard Sinks)|하드 싱크(Hard Sinks)]]`, `유닛 이코노믹스(Unit Economics)`
- **Projects/Contexts:** `[[알비온 온라인(Albion Online)|알비온 온라인(Albion Online)]]`, `[[EVE 온라인(EVE Online)|EVE 온라인(EVE Online)]]`, `[[월드 오브 워크래프트(World of Warcraft)|월드 오브 워크래프트(World of Warcraft)]]`
- **Contradictions/Notes:** 소모처를 활용하는 과정에서 설계상 상충되는 위험성이 존재합니다. 경매장 수수료를 5%에서 10%로 높이는 것은 가장 거대한 통화 회수 기제로 작동하지만, 세금이 너무 높으면 플레이어들이 수수료를 피해 암시장(직거래)으로 내몰리는 부작용이 생길 수 있습니다 [13]. 또한, 강력한 통화 회수를 위해 터무니없이 비싼 초고성능 아이템(Super High-End Items)을 소모처로 추가할 경우, 게임 내 재화를 유료(IAP)로 구매할 수 있는 구조에서는 'Pay to Win' 게임이라는 비판에 직면해 밸런스와 커뮤니티 평판을 망칠 위험이 있습니다 [7, 16, 19].
---
*Last updated: 2026-04-29*
## 📌 Brief 사ummary
자원 소모처(Sinks)는 가상 경제 시스템 내에서 유통되는 재화나 통화를 영구적으로 소모시키거나 시스템 밖으로 삭제하는 장치 혹은 시스템을 의미합니다. 이는 플레이어의 자원 획득처(수도꼭지, Taps/Faucets)와 균형을 이루며, 게임 내 통화 공급량을 조절해 인플레이션을 억제하고 재화의 가치를 보존하는 역할을 합니다. 궁극적으로 성공적인 게임 경제 설계에서 유저의 지속적인 참여를 유도하고 아이템 구매 가치를 유지하기 위한 핵심 구성 요소입니다.
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
### Semgrep — custom sink rule
```yaml
rules:
- id: python-eval-tainted
pattern-sources:
- pattern: request.$X
pattern-sinks:
- pattern: eval(...)
- pattern: exec(...)
pattern-sanitizers:
- pattern: ast.literal_eval(...)
message: User input 의 eval 의 reach
severity: ERROR
languages: [python]
```
## 🤔 의사결정 기준 (Decision Criteria)
### CodeQL — taint tracking
```ql
import python
import semmle.python.dataflow.new.TaintTracking
**선택 A를 써야 할 때:**
- *(TODO)*
class UserInputToSqlConfig extends TaintTracking::Configuration {
override predicate isSource(DataFlow::Node n) {
n.asExpr().(Attribute).getAttr() in ["args", "form", "json"]
}
override predicate isSink(DataFlow::Node n) {
exists(Call c | c.getFunc().(Attribute).getAttr() = "execute" |
n.asExpr() = c.getArg(0))
}
}
```
**선택 B를 써야 할 때:**
- *(TODO)*
### SQL sink — parameterize (fix)
```python
# BAD — sink reachable
db.execute(f"SELECT * FROM users WHERE id = {user_id}")
**기본값:**
> *(TODO)*
# GOOD — sink 의 sanitize (parameterized)
db.execute("SELECT * FROM users WHERE id = %s", (user_id,))
```
## ❌ 안티패턴 (Anti-Patterns)
### Command sink — avoid shell
```python
# BAD
subprocess.run(f"ping {host}", shell=True)
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
# GOOD
subprocess.run(["ping", "-c", "1", host], shell=False)
```
### Path traversal sink — resolve + check
```python
import os
base = "/var/uploads"
path = os.path.realpath(os.path.join(base, user_filename))
if not path.startswith(base + os.sep):
raise PermissionError("path traversal")
open(path, "rb")
```
### XSS sink — escape
```javascript
// BAD
el.innerHTML = userBio;
// GOOD — DOM API
el.textContent = userBio;
// 또는 매 DOMPurify 의 sanitize 후
el.innerHTML = DOMPurify.sanitize(userBio);
```
### SSRF — allowlist
```python
from urllib.parse import urlparse
ALLOWED_HOSTS = {"api.partner.com", "img.cdn.com"}
def safe_fetch(url):
host = urlparse(url).hostname
if host not in ALLOWED_HOSTS: raise ValueError("blocked host")
# 매 DNS rebinding 의 also guard — 매 resolve + IP check
return requests.get(url, timeout=5)
```
### Deserialize sink — never on untrusted
```python
# BAD — pickle 의 RCE
data = pickle.loads(request.body)
# GOOD — JSON only
data = json.loads(request.body)
```
## 매 결정 기준
| Sink type | Sanitizer | Notes |
|---|---|---|
| SQL | Parameterized query, ORM | 매 string concat 의 X |
| Shell | argv list, no `shell=True` | 매 quoting 의 trust 의 X |
| Path | realpath + prefix check | symlink 의 also handle |
| HTML | textContent or DOMPurify | 매 innerHTML 매 last resort |
| Eval | 매 그냥 사용 X | 매 alternative 의 find |
| Deserialize | JSON only on untrusted | pickle/yaml.load 매 X |
**기본값**: 매 sink 의 see 한 후 매 source 의 trace — 매 sanitizer 의 between 의 verify.
## 🔗 Graph
- 부모: [[Application_Security]] · [[Taint_Analysis]]
- 변형: [[SAST]] · [[DAST]] · [[IAST]]
- 응용: [[OWASP_Top_10]] · [[Code_Injection]] · [[XSS]] · [[SQL_Injection]]
- Adjacent: [[Sources]] · [[Sanitizers]] · [[Fuzzing]]
## 🤖 LLM 활용
**언제**: 매 unfamiliar codebase 의 sink inventory 의 quickly 의 generate, 매 PR 매 new sink 의 introduce 의 spot.
**언제 X**: 매 production-grade SAST 의 replace — 매 LLM 의 false negative 의 risk, 매 dedicated tooling 의 use.
## ❌ 안티패턴
- **Blacklist sanitizer**: 매 known-bad 의 remove — 매 bypass 의 always exist.
- **Sanitize at sink**: 매 throughout flow 의 mutate — 매 single point 의 trust 의 X.
- **Trust 매 internal**: 매 internal API 의 source 의 also treat — 매 SSRF · Confused deputy.
- **Generic exception**: 매 sanitizer fail 의 silent swallow — 매 fail closed.
- **String comparison 의 host check**: 매 `endswith("trusted.com")``evil-trusted.com` bypass.
## 🧪 검증 / 중복
- Verified (OWASP Source-Sink-Sanitizer model, CodeQL taint tracking docs, Semgrep registry 2026).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — sink categories, SAST rules, sanitizer patterns |