"매 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.
매 핵심
매 sink 의 종류
Code execution: eval, exec, Function(), os.system, 매 deserialize.
SQL: 매 raw query string concat (f"SELECT * FROM u WHERE id={id}").
# BAD — sink reachabledb.execute(f"SELECT * FROM users WHERE id = {user_id}")# GOOD — sink 의 sanitize (parameterized)db.execute("SELECT * FROM users WHERE id = %s",(user_id,))
// BAD
el.innerHTML=userBio;// GOOD — DOM API
el.textContent=userBio;// 또는 매 DOMPurify 의 sanitize 후
el.innerHTML=DOMPurify.sanitize(userBio);
SSRF — allowlist
fromurllib.parseimporturlparseALLOWED_HOSTS={"api.partner.com","img.cdn.com"}defsafe_fetch(url):host=urlparse(url).hostnameifhostnotinALLOWED_HOSTS:raiseValueError("blocked host")# 매 DNS rebinding 의 also guard — 매 resolve + IP checkreturnrequests.get(url,timeout=5)
Deserialize sink — never on untrusted
# BAD — pickle 의 RCEdata=pickle.loads(request.body)# GOOD — JSON onlydata=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.
언제: 매 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.