
Loongson LA464/LA664 프로세서에서 LASX 벡터 레지스터의 정의되지 않은 상위 비트를 통해 마이크로아키텍처 데이터 유출을 시연하는 개념 증명으로, ZenBleed와 유사합니다.
LoongBleed는 ZenBleed (CVE-2023-20593)와 개념적으로 유사한 하드웨어 취약점으로, LSX(128비트 SIMD)와 LASX(256비트 SIMD)를 모두 구현한 Loongson LA464/LA664 프로세서에 영향을 미칩니다.
LoongArch에서 LSX $vr 레지스터(128비트)는 LASX $xr 레지스터(256비트)의
하위 절반과 별칭(alias) 관계에 있습니다. LSX 명령어와 기본 부동소수점 연산은
하위 128비트(또는 그 일부)에만 작동하도록 정의되어 있으며, 해당 $xr
레지스터의 상위 비트는 정의되지 않습니다. 그러나 마이크로아키텍처 결함으로 인해
이러한 연산이 $xr의 상위 128비트를 통해 데이터를 유출할 수 있으며,
이는 권한 경계를 넘거나 SMT 형제 스레드 간에 민감한 데이터를 노출시킵니다.
독립적 발견에 관한 참고 — 동일한 근본 하드웨어 결함이 CISPA Helmholtz Center for Information Security의 연구진에 의해 LoongLeak이라는 이름으로 독립적으로 발견되어 발표되었으며 (https://loongleakattack.com/), USENIX Security 2026에서 "LoongLeak: Architectural Cross-Privilege-Boundary Data Leakage on LoongArch CPUs"라는 제목으로 발표되었습니다. 우리의 작업은 LoongLeak 팀과 독립적으로 개발되었으며, 두 그룹 모두 Loongson LA464/LA664 프로세서가 LASX
$xr레지스터의 정의되지 않은 상위 비트를 통해 데이터를 유출한다는 동일한 결론에 도달했습니다. 우리가 유출을 유발하는 데 사용하는 명령어는 LoongLeak 논문에서 보고된 것과 동일하지 않다는 점에 유의하십시오. 우리의 PoC는 동일한 근본 하드웨어 결함을 재현하기 위해 다른 가젯 집합(vor.v,vld,fld.d,fld.s)에 의존합니다. 또한 유출이vor.v와 같은 순수 레지스터-레지스터 명령어(메모리 로드 없음)로도 유발될 수 있기 때문에, 우리의 분석은 근본 원인이 물리적 레지스터 재사용일 가능성이 높다고 봅니다. 즉, 재사용된 물리적 레지스터의 상위 비트가 지워지지 않아 이전 레지스터 점유자의 잔여 데이터가 유출되는 것입니다. 이는 유출된 데이터를 L1 데이터 캐시에 기인하는 LoongLeak 논문의 분석과 다릅니다.
개념 증명(proof-of-concept)은 다음과 같이 작동합니다:
xvld를 통해 $xrN 레지스터에 전부 0인 데이터를 로드합니다.xvst를 통해 전체 256비트 레지스터를 다시 저장합니다.PoC는 물리적 코어에 고정된 스레드에서 이 가젯을 16개의 아키텍처 벡터
레지스터($xr0–$xr15)에 걸쳐 반복적으로 실행합니다. 명령어 실행 후
나타나는 0이 아닌 값은 마이크로아키텍처가 잔여 데이터나 교차 컨텍스트
데이터를 아키텍처 레지스터 상태로 전파했음을 나타냅니다.
PoC는 --gadget으로 선택할 수 있는 여러 테스트 명령어를 지원합니다:
| Gadget | Instruction | Description | Leaks on LA664 | Leaks on LA464 |
|---|---|---|---|---|
vor | vor.v $vrN, $vrN, $vrN | $vrN과 자기 자신의 비트 OR | Yes | No |
vld | vld $vrN, … | 메모리에서 $vrN으로의 128비트 로드 | Yes | Yes |
fld.d | fld.d $fN, … | $fN으로의 64비트 부동소수점 로드 ($vrN 하위 64비트의 별칭) | Yes | Yes |
fld.s | fld.s $fN, … | $fN으로의 32비트 부동소수점 로드 ($vrN 하위 32비트의 별칭) | Yes | Yes |
LA664에서는 네 가지 가젯 모두 유출을 노출하며, 벡터당 최대 192비트를
유출합니다. LA464에서는 vld, fld.d, fld.s가 유출하며(벡터당 최대
224비트), 기본 vor.v 가젯은 LA464에서 유출하지 않습니다.
Usage: ./loongbleed_poc [OPTIONS]
Options:
-a, --all Launch one thread pinned to each physical core.
By default only thread on CPU 0 is launched.
-g, --gadget [vor|vld|fld.d|fld.s]
Use different instructions for testing.
-h, --help Show this help and exit.
# Single-thread mode on CPU 0
./run.sh
# Single-thread mode with vld gadget (required for LA464)
./run.sh --gadget vld
# All physical cores, default gadget
./run.sh -a
# All cores with fld.d gadget
./run.sh --all --gadget fld.d
피해자 스레드가 하나의 논리 CPU에서 민감한 데이터를 처리하는 동안 PoC가 SMT 형제 스레드에서 레지스터를 탐색합니다. 스누핑 스레드는 유출된 상위 비트에서 피해자 데이터의 조각을 관찰할 수 있습니다.
# Terminal 1 — start LoongBleed on CPU 0
./run.sh
# Terminal 2 — victim workload on the SMT sibling (CPU 1)
while true; do numactl -C 1 sort < /etc/shadow > /dev/null; done
자동화된 설정을 위해서는 제공된 스크립트를 사용하십시오:
./poc_la664.sh
이 스크립트는 CPU 1(CPU 0의 SMT 형제)에서 sort 워크로드를 생성하고,
기본 가젯으로 CPU 0에서 LoongBleed를 실행합니다.
피해자 스레드가 하나의 CPU에서 민감한 데이터를 처리하는 동안 PoC가 동일한
코어에서 레지스터를 탐색합니다. 기본 vor.v 가젯은 LA464에서 유출하지
않으므로 --gadget vld가 필요합니다.
# Terminal 1 — start LoongBleed on CPU 0
./run.sh --gadget vld
# Terminal 2 — victim workload on the same core
while true; do numactl -C 0 sort < /etc/shadow > /dev/null; done
자동화된 설정을 위해서는:
./poc_la464.sh
이 스크립트는 CPU 0에서 sort 워크로드를 생성하고 --gadget vld로
LoongBleed를 실행합니다.
PoC는 외부 의존성이 없는 단일 파일 C++ 프로그램입니다.
g++ -std=c++11 -O2 -march=native -pthread -o loongbleed_poc loongbleed_poc.cpp
또는 제공된 스크립트를 사용하십시오:
./run.sh
# or, on LA464:
./run.sh --gadget vld
유출이 감지되고 유출된 바이트에 최소 8개의 연속된 출력 가능 ASCII 문자 (0x20–0x7e)가 포함된 경우, PoC는 다음을 출력합니다:
[cpu 0] LEAK chunk=14 data=0x7461646e756f4620_6572617774666f53_0000000000000000_0000000000000000 ascii=............Software Foundat
$xr0–$xr15) 중 트리거한 슬롯$xrN에서 다시 읽어온 전체 256비트 값으로,
data3_data2_data1_data0 형식으로 표시되며:
data0 = 비트 [63:0] (결과의 최하위 64비트)data1 = 비트 [127:64] (하위 128비트 절반의 상위 64비트)data2 = 비트 [191:128] (상위 128비트 절반의 하위 64비트)data3 = 비트 [255:192] (상위 128비트 절반의 상위 64비트).로 표시됩니다.상위 128비트(data2 또는 data3)에 0이 아닌 값이 있으면 마이크로아키텍처
데이터 유출을 나타냅니다.
이 취약점은 Chips and Cheese의 기사 "Loongson's LSX and LASX Vector Extensions"를 읽던 중 발견되었습니다. 이 기사는 벡터 명령어가 일부 임의의 데이터 잔여물을 남길 수 있다고 언급했습니다. 이는 레지스터 리네이밍이 레지스터를 지우지 않을 수 있다는 가설로 이어졌으며 — ZenBleed와 유사한 메커니즘으로 — 이론상 커널 공간 데이터를 유출할 수 있게 합니다. 이후 이 가설을 검증하기 위한 실험을 수행했고, 실제로 유출이 발생하며 Loongson 3A5000과 3A6000 모두에서 재현되었습니다.
이 프로젝트는 교육 및 보안 연구 목적으로만 제공됩니다.