Linux 커널에서는 다음 취약점이 해결되었습니다. bpf: 원자 가져오기 정밀도 추적으로 인한 잘못된 가지치기 수정 backtrack_insn이 BPF_ATOMIC이 있는 BPF_STX 명령어를 발견하는 경우 BPF_FETCH, src 레지스터(또는 BPF_CMPXCHG의 경우 r0)도 다음과 같이 작동합니다. 따라서 메모리 위치에서 이전 값을 받습니다. 현재 역추적 논리는 이를 설명하지 않습니다. 치료한다 src가 있는 일반 저장소와 동일한 원자 가져오기 작업 등록은 in 뿐입니다.
Linux 커널에서는 다음 취약점이 해결되었습니다.
bpf: 원자 가져오기 정밀도 추적으로 인한 잘못된 가지치기 수정
backtrack_insn이 BPF_ATOMIC이 있는 BPF_STX 명령어를 발견하는 경우 BPF_FETCH, src 레지스터(또는 BPF_CMPXCHG의 경우 r0)도 다음과 같이 작동합니다. 따라서 메모리 위치에서 이전 값을 받습니다.
현재 역추적 논리는 이를 설명하지 않습니다. 치료한다 src가 있는 일반 저장소와 동일한 원자 가져오기 작업 레지스터는 입력일 뿐입니다. 이로 인해 backtrack_insn이 실패하게 됩니다. 스택 위치에 정밀도를 전파한 다음 표시되지 않습니다. 정확하다!
나중에 검증자의 경로 가지치기가 두 가지 상태를 잘못 고려할 수 있습니다. 스택 상태 측면에서 다를 때 동일합니다. 의미는 둘 가지는 동등하게 취급될 수 있으므로 가지가 가지치기될 때 가지치기가 가능합니다. 그렇게 보아서는 안 됩니다.
다음과 같이 수정하십시오. backtrack_insn의 BPF_LDX 처리를 확장하여 is_atomic_fetch_insn() 도우미를 통해 원자 가져오기 작업도 다룹니다. 페치 dst 레지스터가 정밀하게 추적되면 이를 지우십시오. 스택 슬롯으로 정밀도를 전파합니다. 비스택 메모리의 경우, 정밀 걷기는 일반 명령과 동일하게 원자 명령에서 중지됩니다. BPF_LDX. 여기에는 모든 가져오기 변형이 포함됩니다.
이전:
0: (b7) r1 = 8; R1=8 1: (7b) *(u64 *)(r10 -8) = r1; R1=8 R10=fp0 fp-8=8 2: (b7) r2 = 0; R2=0 3: (db) r2 =atom64_fetch_add((u64 *)(r10 -8), r2) ; R2=8 R10=fp0 fp-8=mmmmmmmm 4: (bf) r3 = r10; R3=fp0 R10=fp0 5: (0f) r3 += r2 mark_precise: 프레임0: last_idx 5 first_idx 0 subseq_idx -1 mark_precise: 프레임0: regs=r2 스택= 4 이전: (bf) r3 = r10 mark_precise: 프레임0: regs=r2 스택= 3 이전: (db) r2 =omic64_fetch_add((u64 *)(r10 -8), r2) mark_precise: 프레임0: regs=r2 스택= 2 이전: (b7) r2 = 0 6: R2=8 R3=fp8 6: (b7) r0 = 0; R0=0 7: (95) 출구
이후:
0: (b7) r1 = 8; R1=8 1: (7b) *(u64 *)(r10 -8) = r1; R1=8 R10=fp0 fp-8=8 2: (b7) r2 = 0; R2=0 3: (db) r2 =atom64_fetch_add((u64 *)(r10 -8), r2) ; R2=8 R10=fp0 fp-8=mmmmmmmm 4: (bf) r3 = r10; R3=fp0 R10=fp0 5: (0f) r3 += r2 mark_precise: 프레임0: last_idx 5 first_idx 0 subseq_idx -1 mark_precise: 프레임0: regs=r2 스택= 4 이전: (bf) r3 = r10 mark_precise: 프레임0: regs=r2 스택= 3 이전: (db) r2 =omic64_fetch_add((u64 *)(r10 -8), r2) mark_precise: 프레임0: regs= 스택=-8 2 이전: (b7) r2 = 0 mark_precise: 프레임0: regs= stack=-8 1 이전: (7b) *(u64 *)(r10 -8) = r1 mark_precise: 프레임0: regs=r1 스택= 0 이전: (b7) r1 = 8 6: R2=8 R3=fp8 6: (b7) r0 = 0; R0=0 7: (95) 출구
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 78.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 78.00 |
VPI 공식 vpi-v1 기준