[보안 공지] ASP.NET Core 권한 상승 취약점 — CVE-2026-40372

2026년 4월 21일, Microsoft가 Microsoft.AspNetCore.DataProtection NuGet 패키지의 권한 상승(Elevation of Privilege) 취약점에 대한 보안 권고와 함께 out-of-band 패치(10.0.7)를 공개했습니다. 운영 중인 ASP.NET Core 10 애플리케이션이 있다면 영향 여부를 즉시 확인하시고, 해당된다면 패치 적용과 더불어 DataProtection 키 링 회전까지 함께 검토하시기 바랍니다.

한 줄 요약

Microsoft.AspNetCore.DataProtection 10.0.0 ~ 10.0.6 버전의 관리형 인증 암호화기(managed authenticated encryptor)가 HMAC 검증 태그를 잘못 계산하는 회귀 버그가 있어, 공격자가 인증 쿠키·antiforgery 토큰 등 보호된 페이로드를 위조하거나 복호화할 수 있습니다.


취약점 개요

항목
CVE CVE-2026-40372
등급(Microsoft) Important
CVSS 3.1 8.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N)
약점 분류 CWE-347: Improper Verification of Cryptographic Signature
영향 패키지 Microsoft.AspNetCore.DataProtection
영향 버전 >= 10.0.0, <= 10.0.6
패치 버전 10.0.7
공개일 2026-04-21

참고: NVD 등 일부 외부 데이터베이스는 동일 CVE에 대해 9.1(HIGH) 점수를 부여하고 있습니다. Microsoft 공식 권고 기준 점수는 8.1입니다.


무엇이 잘못되었나

Microsoft.AspNetCore.DataProtection 10.0.0~10.0.6의 managed authenticated encryptor가 페이로드의 잘못된 바이트 구간에 대해 HMAC 검증 태그를 계산하고, 일부 경로에서는 계산된 해시를 폐기해 버리는 회귀가 있었습니다. 그 결과 CalculateAndValidateMac 단계에서 무결성 검증이 실질적으로 깨지며, 패딩 오라클(padding-oracle) 공격을 통한 페이로드 위조가 가능합니다.

이는 과거 MS10-070(레거시 ASP.NET 암호화 인프라의 패딩 오라클 취약점)과 능력 면에서 비교 가능한 수준의 결함입니다.

공격 시나리오

  1. 공격자가 인증 쿠키 등 보호된 페이로드를 위조하여 권한 있는 사용자로 인증

  2. 인증된 상태에서 애플리케이션이 정상적으로 발급하는 합법적으로 서명된 토큰(세션 리프레시, API 키, 비밀번호 재설정 링크 등)을 자기 자신에게 발급받음

  3. 패치 적용 이후에도 해당 토큰은 키 링이 회전되지 않는 한 계속 유효

즉, 패치만으로는 취약 기간 중 발급된 합법적 토큰이 무효화되지 않는다는 점이 이 취약점의 핵심적인 운영상 위험 요소입니다.


우리 시스템이 영향을 받는가

1차 영향군 (net10.0 타겟)

아래 조건을 모두 만족하면 영향 대상입니다.

  • 애플리케이션이 Microsoft.AspNetCore.DataProtection 10.0.6을 직접 또는 전이적으로(StackExchangeRedis, EntityFrameworkCore, AzureKeyVault, AzureStorage, Redis 등) 참조

  • 해당 NuGet 바이너리가 런타임에 실제로 로드됨

    • Microsoft.NET.Sdk.Web SDK를 사용하지 않거나, Microsoft.AspNetCore.App 프레임워크 참조가 직·간접적으로 없을 때

    • 또는 .NET 10 기본값인 PrunePackageReference를 명시적으로 비활성화한 경우

  • Linux, macOS 등 비-Windows 운영체제에서 실행

2차 영향군 (net462 / netstandard2.0 타겟)

Microsoft.AspNetCore.DataProtection 10.0.0~10.0.6을 참조하면서, net462 또는 netstandard2.0 타겟 자산을 빌드에서 사용한 경우입니다.

  • .NET Framework 4.6.2 이상에서 ASP.NET Core DataProtection NuGet을 사용하는 데스크톱·서버 앱

  • netstandard2.0을 타겟팅하는 라이브러리가 10.0 DataProtection 패키지를 참조하고, 비-net10.0 런타임에서 로딩되는 경우

이 경로는 net10.0 자산에만 존재하는 CNG 경로 대신 동일한 managed encryptor 코드 경로를 모든 OS에서 사용하므로, 아래의 Windows 예외가 적용되지 않습니다.

영향을 받지 않는 경우

  • 애플리케이션이 Windows에서 실행되는 경우 (1차 영향군 조건에 한함)

  • net10.0 프레임워크 의존(framework-dependent) 모드로 실행되며, 설치된 ASP.NET Core 공유 프레임워크 버전이 PackageReference 버전과 같거나 더 높은 경우

    • 예: 공유 프레임워크 10.0.6 + PackageReference 10.0.6 → 안전

    • 예: 공유 프레임워크 10.0.5 + PackageReference 10.0.6 → 취약

  • Microsoft.AspNetCore.DataProtection 8.0.x 또는 9.0.x를 사용하는 모든 경우 (해당 결함 코드는 10.0 개발 중 도입되었으며 8.0/9.0 서비싱 브랜치로 백포트된 적이 없습니다)

  • 영향 버전 패키지를 한 번도 참조한 적이 없는 경우


조치 방법

1단계 — 패키지 업그레이드 (필수)

Microsoft.AspNetCore.DataProtection10.0.7 이상으로 업그레이드한 뒤 재배포합니다. 패치된 검증 루틴은 취약 기간에 위조된(전부 0으로 채워진 HMAC를 가진) 페이로드를 거부합니다.

2단계 — DataProtection 키 링 회전 (조건부 필수)

영향 대상이면서 취약 기간 중 인터넷에 노출된 엔드포인트를 운영했다면 키 링을 반드시 회전해야 합니다. 그렇지 않으면 위조된 자격 증명으로 발급받은 합법적 서명 토큰이 패치 후에도 계속 유효합니다.

내장 키 매니저를 사용한 예시:

// 동일한 키 링에 접근 가능한 애플리케이션에서 1회 실행
// revocationDate는 10.0.6 배포 직전 시각으로 설정
var services = new ServiceCollection()
    .AddDataProtection()
    // ... 기존 repository / protection 설정 ...
    .Services
    .BuildServiceProvider();

var keyManager = services.GetRequiredService<IKeyManager>();
keyManager.RevokeAllKeys(
    revocationDate: DateTimeOffset.UtcNow,
    reason: "CVE-2026-40372: DataProtection 10.0.6 validation bypass");

RevokeAllKeys를 호출하면 키 링의 모든 기존 키가 폐기되며 다음 보호 연산 시 새 키가 자동 생성됩니다. 모든 사용자가 재로그인해야 하고, antiforgery 토큰도 모두 재발급됩니다.

취약 기간을 정확히 알고 있어 좀 더 외과적으로 접근할 수 있다면, RevokeAllKeys 대신 RevokeKey(Guid keyId, string reason)로 해당 기간에 활성화되어 있던 키만 선택적으로 폐기할 수 있습니다.

3단계 — 애플리케이션 레벨 장기 자격 증명 감사

키 회전으로도 무효화되지 않는, 취약 기간 중 인증된 요청을 통해 발급되었을 수 있는 장기 자격 증명을 별도로 회전해야 합니다.

  • 보호된 엔드포인트를 통해 DB에 저장된 API 키, 리프레시 토큰, 액세스 토큰

  • 취약 기간 중 발급되어 아직 만료되지 않은 비밀번호 재설정 링크, 이메일 인증 토큰

  • 인증된 요청이 발급을 유도할 수 있는 기타 영속 자격 증명

만약 인증된 엔드포인트에서 장기 자격 증명을 발급하는 경로가 없다면 키 회전만으로 충분합니다.

4단계 — 보호된 페이로드 내부 평문 자산 점검 (권장)

IDataProtector.Protect 출력 안에 DB 연결 문자열, 서드파티 API 키 등 장기 비밀을 보관해 왔다면, 해당 비밀들이 노출되었을 가능성을 가정하고 원본에서 회전합니다.

5단계 — 웹 서버 로그 검토 (권장)

패딩 오라클 공격은 1바이트 복원에 다수의 요청을 필요로 하므로, 정상 트래픽 대비 자릿수가 다른 요청량을 발생시킵니다. 보호된 페이로드(인증 쿠키, antiforgery 토큰, state 파라미터)를 받는 단일 인증 엔드포인트에 대해, 취약 기간 중 쿠키·쿼리 파라미터 값이 다양하게 변형되며 지속적으로 들어오는 대량 트래픽이 있었다면 침해 시도의 강한 지표입니다.


참고 링크


운영 환경 및 CI/CD 파이프라인의 NuGet 의존성을 빠르게 감사해 보시고, 1차/2차 영향군에 해당된다면 키 링 회전과 장기 토큰 회전 계획까지 함께 수립하시기를 권합니다.

이 글은 AI를 통하여 요약/정리한 내용입니다.

2개의 좋아요