, ,

[어원] mangle — 원본을 뒤틀고 변형하다, 그리고 자가당착 망글링

mangle 는 한국어 번역으로는 “짓이기다·망가뜨리다” 한 줄이지만, C++ 빌드 로그의 심볼 이름 에서 만나 보면 결이 다르다 — 세탁기 롤러로 옷을 짓이기듯 원형을 알아볼 수 없게 비트는 결인데 컴파일러가 print(int)를 _Z5printi로 바꾸는 name mangling도 정확히 같은 “형태 파괴” 이미지였다. 차이의 출발점이 어원에 있어서, 결론부터 한 줄로 정리해둔다.

한눈에 보기

항목 내용
단어 mangle /ˈmæŋ.ɡəl/
품사 동사 (타동사), 명사
핵심 의미 원본 형태를 알아볼 수 없게 심하게 손상·변형하다
컴퓨터 의미 식별자·패킷·데이터를 규칙에 따라 변환·훼손하는 것
어원 경로 Frankish *mahagnjan → Old French mahaignier → Anglo-French mangler → Middle English manglen
형제 단어 maim (같은 Old French 뿌리), garble, obfuscate, corrupt

어원 분해

mangle
├── Anglo-French: mangler  (반복적으로 훼손하다 — 빈도동사형)
│   └── Old French: mahaignier  (불구로 만들다, 상처 입히다)
│       └── Frankish: *mahagnjan  (손상시키다)
│           └── Proto-Germanic 계열  (힘/능력의 부정적 전용)
│
└── 의미 분기
    ├── [물리] 칼로 마구 자르다, 짓이기다, 원형 훼손
    ├── [언어] 텍스트·발음을 알아볼 수 없게 망가뜨리다
    └── [전산] 식별자·패킷·데이터를 규칙에 따라 변환·오염시키다

manglemaim은 같은 Old French 어간 mahaignier에서 나왔다. maim이 “영구 불구”에, mangle은 “형태 파괴 과정”에 초점을 맞춘 분화다.


PIE 뿌리 — 불확실성 메모

mangle의 정확한 PIE 뿌리는 학계에서 여전히 논의 중이다. 어원 경로가 Frankish(게르만 방언) → Old French(로망스어) → 영어를 거치다 보니 PIE 단계 연결이 불분명하다.

경로 근거
Frankish *mahagnjan Proto-Gmc → Frankish → Old French mahaignier maim과 공통 어간, OED 채택
PIE *mey- (자르다, 손상) *mey- → Gmc → Frankish 일부 어원학자, 직접 증거 부족

실용적으로는 “Old French mahaignier에서 왔고, maim과 형제”라는 사실만 기억해도 충분하다.


의미 변천

시기 형태 의미
14세기 manglen (Middle English) 칼로 마구 자르다, 반복적으로 훼손하다
17세기 mangle (English 정착) 심하게 손상, 원형 알아볼 수 없게 만들다
19세기 mangle (세탁 기계) 별도 어원: Dutch mangel ← Greek manganon (회전 기계) — 세탁물 짜는 롤러
1980년대~ name mangling (CS) 컴파일러가 함수·변수명을 내부 기호로 변환 (C++, Python)
1990년대~ packet mangling 패킷 헤더·페이로드를 규칙에 따라 변형 (iptables MANGLE)
2000년대~ DNS mangling DNS 응답을 조작·위변조하는 것

“세탁기 망글”과 “코드 망글링”은 철자가 같아도 어원이 다르다. 전자는 Greek manganon(회전 기계), 후자는 Old French mahaignier(훼손). 맥락이 어원을 결정한다.


컴퓨터 과학에서의 mangle 세 가지 용법

① Name Mangling — 컴파일러의 이름 변환

C++은 함수 오버로딩을 지원하기 위해 컴파일러가 소스 코드의 함수명을 내부 심볼로 변환한다.

// 소스 코드 (같은 이름, 다른 시그니처)
void print(int x);
void print(double x);

// GCC 컴파일 후 내부 심볼
_Z5printi    // print(int)   — i = int
_Z5printd    // print(double) — d = double

Python도 클래스 내부 속성 보호에 name mangling을 사용한다.

class Foo:
    def __init__(self):
        self.__secret = 42   # 외부에서 foo.__secret 으로 접근 불가

# 실제 저장 이름: _Foo__secret
print(Foo()._Foo__secret)   # 42  (우회는 가능, 의도적 경고용)

② Packet Mangling — iptables MANGLE 테이블

Linux netfilter의 MANGLE 테이블은 패킷 헤더 필드를 변형하는 전용 후크다. DPI 우회 도구들이 이 레이어에서 동작한다.

# TTL 값 조작 — 미들박스 TTL 검사 우회
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j TTL --ttl-set 3

# 페이크-TTL 디코이: 미들박스에는 TTL=3 패킷이 먼저 도달, 실제 목적지에는 다음 패킷
# → 미들박스 IDS/DPI는 오염된 패킷 기준으로 판단

# TOS/DSCP QoS 마킹
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 1

③ SNI/DNS Mangling — DPI 우회 기법

DPI 우회 도구(VeilGate 등)가 수행하는 망글링의 목표는 미들박스가 원본 메타데이터를 읽지 못하게 하는 것이다.

기법 망글링 대상 원리
SNI 단편화 TLS ClientHello SNI 필드를 여러 TCP 세그먼트로 분할 → 미들박스가 재조합 못하면 SNI 인식 실패
Host 변형 HTTP Host 헤더 대소문자 혼합, 공백 삽입 등으로 평문 헤더를 패턴 매칭에서 이탈시킴
페이크-TTL 디코이 IP TTL 필드 짧은 TTL의 가짜 패킷을 앞에 보내 미들박스를 속임 (실제 패킷은 뒤에)
DNS 망글링 (악의적) DNS UDP 응답 ISP/정부가 DNS 응답을 위변조 → DoH가 이를 우회하는 이유

자가당착 망글링 — DPI가 자신의 DoH를 망글링할 때

DPI bypass와 DoH를 동시에 구동할 때 발생하는 충돌의 핵심이 바로 자가당착 망글링(self-mangling)이다.

상황: DPI 엔진이 모든 TCP:443 트래픽에 SNI 단편화 적용

[앱] → DoH 쿼리 (HTTPS:443, DoH resolver 목적지)
           ↓
    [DPI 엔진: "모든 :443은 SNI 분할"]
           ↓
    DoH의 TLS ClientHello도 분할됨
           ↓
    DoH resolver: 잘린 패킷 → 핸드셰이크 실패 → DNS 오류
           ↓
    DPI가 의존하는 DNS 자체가 죽음 → 모든 도메인 연결 불가

DPI는 “무엇을 보내는지”를 가리기 위해 패킷을 망글링하지만, 같은 망글링이 “누구에게 가는지”를 암호화하는 DoH 트래픽을 파괴한다. 서로 다른 레이어를 담당하는 두 도구가 출구 IP 정보를 공유하지 않으면 이 충돌은 불가피하다.

해결책 (R5): DPI 엔진이 DoH resolver의 목적지 IP를 망글링 예외 화이트리스트로 관리한다. DoH resolver 주소(예: 1.1.1.1:443, 8.8.8.8:443)는 SNI 단편화 대상에서 제외하고 직통 전송한다.

DoH DPI bypass
담당 레이어 DNS (도메인 이름 암호화) TLS/HTTP 메타데이터 (SNI, Host 변형)
가리는 것 “누구에게 가는지” (도메인명) “무엇을 보내는지” (연결 패턴)
둘 다 필요한 이유 DoH만 → SNI로 노출 / DPI만 → DNS로 노출 / 둘 다 → SNI+DNS 양쪽 차단
충돌 지점 DPI가 DoH 트래픽(TCP:443)도 망글링 → DoH 핸드셰이크 실패

예문

일반 영어

The machine mangled his hand beyond recognition.
기계가 그의 손을 알아볼 수 없을 정도로 짓이겼다.

The translator mangled the original meaning completely.
번역기가 원래 의미를 완전히 훼손시켰다.

He mangled the speech by mispronouncing every technical term.
그는 모든 기술 용어를 잘못 발음해서 연설을 망쳐 버렸다.

컴퓨터 과학

// C++ name mangling
The linker error showed _Z3fooi — the C code was calling foo() but couldn't find
the mangled C++ symbol.
링커 오류에 _Z3fooi가 떴다 — C 코드가 foo()를 호출하지만 망글링된 C++ 심볼을 찾지 못한 것이다.

// DPI mangling
VeilGate fragments the TLS ClientHello across multiple TCP segments,
mangling the SNI field so the middlebox cannot reconstruct it.
VeilGate는 TLS ClientHello를 여러 TCP 세그먼트로 분할해 SNI 필드를 망글링하며,
미들박스가 이를 재조합하지 못하게 한다.

// Self-mangling
If the DPI engine mangles all port-443 traffic indiscriminately,
it will mangle its own DoH queries — breaking the very DNS it depends on.
DPI 엔진이 모든 443 포트 트래픽을 무차별로 망글링하면,
자신이 의존하는 DNS를 위한 DoH 쿼리도 함께 망글링해 버린다.

형제 단어 — 같은 “변형·손상” 계열

단어 어원 핵심 뉘앙스 컴퓨터 용례
maim Old French mahaignier (mangle과 동일) 영구적 신체 손상
garble Arabic gharbala (체로 치다) → 선택적 왜곡 정보를 뒤섞어 의미 오염 garbled packet, garbled output
corrupt Latin corrumpere (완전히 부수다) 원본 신뢰성 파괴 file corruption, memory corruption
obfuscate Latin ob+fuscare (어둡게 하다) 의도적으로 불명확하게 code obfuscation, obfuscated JS
scramble 어원 불명, 16c 영어 뒤섞어 원래 순서 파괴 scrambled eggs / scrambled signal
clobber 20c 속어, 어원 불명 덮어쓰거나 파괴하다 register clobber (어셈블리)

mangle은 “과정의 폭력성”에, garble은 “결과의 의미 왜곡”에, obfuscate는 “의도성”에 방점이 찍힌다. DPI가 하는 일은 mangle(패킷 구조 변형)이고, DNS 위변조는 garble(응답 내용 오염)에 가깝다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다