Linux 커널에서는 다음 취약점이 해결되었습니다. writeback: inode_switch_wbs_work_fn()에서 해제 후 사용 수정 inode_switch_wbs_work_fn()에는 다음과 같은 루프가 있습니다. wb_get(new_wb); 동안 (1) { 목록 = lllist_del_all(&new_wb->switch_wbs_ctxs); /* 할 일이 없나요? */ 만약 (!목록) 휴식; ... 항목을 처리합니다 ... } 이제 목록에 항목을 추가하면 다음과 같습니다. wb_queue_isw() if (llist_add(&isw->list, &wb->switch_wbs_ctxs)) queue_work(isw_wq, &wb->switch_work);
Linux 커널에서는 다음 취약점이 해결되었습니다.
writeback: inode_switch_wbs_work_fn()에서 해제 후 사용 수정
inode_switch_wbs_work_fn()에는 다음과 같은 루프가 있습니다.
wb_get(new_wb); 동안 (1) { 목록 = lllist_del_all(&new_wb->switch_wbs_ctxs); /* 할 일이 없나요? */ 만약 (!목록) 휴식; ... 항목을 처리합니다 ... }
이제 목록에 항목을 추가하면 다음과 같습니다.
wb_queue_isw() if (llist_add(&isw->list, &wb->switch_wbs_ctxs)) queue_work(isw_wq, &wb->switch_work);
isw 항목을 처리할 때 inode_switch_wbs_work_fn()이 반복되기 때문에 wb->switch_work가 보류 중이고 wb->switch_wbs_ctxs가 보류 중인 경우가 발생할 수 있습니다. 비어 있습니다. 이 경우 wb가 해제될 수 있기 때문에 문제가 됩니다(isw는 없음). 항목 -> wb 참조 없음) 작업이 아직 보류 중인 동안 무료 사용 후 문제.
wb를 해제할 때 작업을 취소하는 것만으로는 이 문제를 해결할 수 없습니다. wb refcount에서 여전히 문제가 있는 0 -> 1 전환을 유발할 수 있습니다. inode_switch_wbs_work_fn()의 wb_get()입니다. 그것은 모두 처리 될 수 있습니다 좀 더 조심스러운 코드를 작성하지만 불필요하게 복잡해 보이므로 피하도록 하겠습니다. 루프가 실제로 실용적이라는 것이 입증될 때까지 혜택. 대신 inode_switch_wbs_work_fn()에서 루프를 제거하십시오. 그렇게 하면 wb_queue_isw() 대기열이 작동할 때 우리는 다음을 보장받습니다. wb->switch_wbs_ctxs에 첫 번째 항목을 추가했는데 아무도 그렇게 하지 않을 것입니다. 대기 중인 작업이 완료될 때까지 제거하고 보유하고 있는 wb 참조를 삭제합니다. 달린다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 78.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 78.00 |
VPI 공식 vpi-v1 기준