
CVE-2024–27630 참조
Savane v3.12 및 이전 버전에서는 /bugs/index.php에서 파일을 삭제할 때 file_id 매개변수에 대한 검증이 없어 안전하지 않은 직접 객체 참조(IDOR) 취약점이 발생합니다. 이 취약점으로 인해 버그 트래커가 있는 그룹의 인증된 관리자가 임의의 버그 트래커 첨부 파일을 임의로 삭제할 수 있으며, 그 결과 해당 파일의 가용성이 상실됩니다. 파일 ID는 새 업로드마다 증가하므로 file_id를 이용해 서버의 모든 파일 첨부물을 반복적으로 삭제하는 스크립트를 작성할 수 있습니다.
CWE 분류: CWE-639: 사용자 제어 키를 통한 인증 우회
보고자: Ally Petitt
영향받는 제품: Savane
영향받는 버전: 3.12 및 이전 버전
버그 트래커에서 파일 첨부물을 삭제하는 함수는 아래 코드 블록에 정의된 trackers_data_delete_file()입니다.
frontend/php/include/trackers/data.php:2417
function trackers_data_delete_file ($group_id, $item_id, $file_id)
{
global $sys_trackers_attachments_dir;
# Make sure the attachment belongs to the group.
$res = db_execute ("
SELECT bug_id from " . ARTIFACT . " WHERE bug_id = ? AND group_id = ?",
[$item_id, $group_id]
);
if (db_numrows ($res) <= 0)
{
# TRANSLATORS: the argument is item id (a number).
$msg = sprintf (
_("Item #%s doesn't belong to project"), $item_id
);
fb ($msg, 1);
return;
}
$result = false;
# Delete the attachment.
if (unlink ("$sys_trackers_attachments_dir/$file_id"))
$result = db_execute ("
DELETE FROM trackers_file WHERE item_id = ? AND file_id = ?",
[$item_id, $file_id]
);
이 함수는 item_id에 지정된 버그 ID가 공격자가 속한 그룹(즉, $group_id)에 속해 있는지 확인하는 SQL 쿼리로 시작합니다. 함수는 file_id도 해당 그룹에 속하는지 확인하지 못하므로, item_id가 공격자 그룹의 유효한 버그에 해당하는 한 공격자는 file_id를 수정하여 업로드 디렉터리 /var/lib/savane/trackers_attachments의 모든 파일을 가리키게 할 수 있습니다.
또한 이 함수는 버그 트래커 관리자만 호출할 수 있습니다.
frontend/php/bugs/index.php:586
case 'delete_file':
# Remove an attached file.
if ($is_trackeradmin)
{
trackers_data_delete_file($group_id, $item_id, $item_file_id);
# Unset previous settings and return to the item.
$depends_search = $reassign_change_project_search = $add_cc
= $input_file = $changed = $vfl = $details = null;
include '../include/trackers_run/mod.php';
}
else
exit_permission_denied ();
break;
다음 단계는 권한이 없는 파일 하나를 삭제하는 것을 보여줍니다. 단, 공격자는 파일 ID가 예측 가능하므로 ID를 이용해 모든 파일 삭제를 자동화할 수 있다는 점에 유의하세요.
40231은 피해자가 업로드한 것입니다:root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230 40231
공격자가 관리자인 그룹의 홈페이지를 방문합니다. 그런 다음 Bugs > Browse를 방문하여 표의 가장 왼쪽 열에 있는 유효한 Item ID를 확인합니다. 이 ID는 다음 단계에서 사용됩니다.
공격자는 /bugs/index.php?func=delete_file&item_id=<ATTACKER_ITEM_ID>&item_file_id=<FILE_ID_TO_DELETE> 경로로 GET 요청을 보냅니다.
제 경우에는 http://172.17.0.2:7890/bugs/index.php?func=delete_file&item_id=50697&item_file_id=40231 과 같은 형태입니다.
피해자의 파일(공격자에게 권한이 없는 그룹의 파일)이 삭제되었는지 확인합니다. 예를 들면 다음과 같습니다:
root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230
Savane 3.13 이상 버전으로 업그레이드하세요. 패치는 여기에서 확인할 수 있습니다.