programing

사용자가 제출한 파일의 압축을 푸는 보안

powerit 2023. 6. 7. 23:21
반응형

사용자가 제출한 파일의 압축을 푸는 보안

여기서 코딩 문제가 아니라 보안과 관련된 일반적인 질문입니다.저는 현재 사용자가 제출한 콘텐츠를 허용하는 프로젝트를 진행하고 있습니다.이 콘텐츠의 주요 부분은 사용자가 Zip 파일을 업로드하는 것입니다.zip 파일은 mp3 파일만 포함해야 합니다.

그런 다음 사용자가 들을 수 있도록 웹 사이트의 오디오를 스트리밍할 수 있도록 해당 파일을 서버의 디렉터리에 압축을 풉니다.

제 걱정은 이것이 잠재적으로 손상될 수 있는 zip 파일에 대해 열려 있다는 것입니다.저는 과거에 'zipbombs'에 대해 읽은 적이 있으며, 명백히 악의적인 zip 파일이 손상을 일으키는 것을 원하지 않습니다.

그렇다면, 이것을 하는 안전한 방법이 있을까요?zip 파일을 먼저 풀지 않고 스캔할 수 있으며 MP3 이외에 다른 내용이 포함되어 있으면 삭제하거나 관리자에게 경고를 표시할 수 있습니까?

만약 그것이 차이가 있다면, 나는 워드프레스에서 사이트를 개발하고 있습니다.저는 현재 워드프레스의 기본 업로드 기능을 사용하여 사용자가 zip 파일을 서버에 업로드할 수 있도록 하고 있습니다(워드프레스 내에 zip 파일을 스캔할 수 있는 보안 형태가 있는지 모르겠습니다).

코드, zip에서 MP3만 추출, 다른 것은 모두 무시

$zip = new ZipArchive();
$filename = 'newzip.zip';

if ($zip->open($filename)!==TRUE) {
   exit("cannot open <$filename>\n");
}

for ($i=0; $i<$zip->numFiles;$i++) {
   $info = $zip->statIndex($i);
   $file = pathinfo($info['name']);
   if(strtolower($file['extension']) == "mp3") {
        file_put_contents(basename($info['name']), $zip->getFromIndex($i));
   }

}
$zip->close();

▁use니사용합▁i 같은 것을 사용할 것입니다.id3_get_version(http://www.php.net/manual/en/function.id3-get-version.php) 도 파일 내용이 mp3인지 확인합니다.

그들이 MP3 ZIP을 해야 하는 이유가 있습니까?MP3의 ID3v2 정보에 텍스트 프레임이 많지 않은 경우 사전 저장으로 인해 파일 크기가 ZIP과 함께 증가합니다.

제가 알기로는 ZIP을 실제로 구문 분석하지 않고 스캔할 수 있는 방법은 없습니다.각 비트를 Huffman 사전에서 실행하기 전까지는 데이터가 불투명합니다.MP3 파일이 무엇인지 어떻게 결정하시겠습니까?파일 확장명으로?액자로?MP3 인코더는 표준이 느슨하여(디코더는 더 엄격한 사양을 가지고 있음) 잘못된 네거티브 없이 파일 구조를 스캔하기 어렵습니다.

ZIP 보안 위험은 다음과 같습니다.

  1. 버퍼 오버플로를 일으키는 주석 데이터입니다.해결책: 주석 데이터를 제거합니다.
  2. 압축된 크기는 작지만 파일 시스템을 채우기 위해 팽창하는 ZIP(고전적 ZIP 폭탄).해결책: 팽창하기 전에 팽창된 크기를 확인합니다. 사전을 확인하여 항목이 많고 압축된 데이터가 모두 1의 것이 아닌지 확인합니다.
  3. 중첩 ZIP(#2 관련).해결책: ZIP 아카이브의 항목 자체가 ZIP 데이터인 경우 중지합니다.중앙 디렉토리의 마커인 0x02014b50(16진수, ZIP - http://en.wikipedia.org/wiki/Zip_%28file_format%29#Structure) 에서 항상 little-endian)을 확인하여 이 문제를 확인할 수 있습니다.
  4. 중첩된 디렉토리 구조로, 파일 시스템의 제한을 초과하고 압축 해제 프로세스를 중단합니다.해결 방법: 디렉터리의 압축을 풀지 않습니다.

따라서 많은 스크러빙 및 무결성 검사를 하거나 최소한 PHP를 사용하여 아카이브를 검색합니다. 각 파일의 MP3-ness를 확인합니다. (어떻게 해도 확장자와 MP3 헤더의 존재)?하지만 그들이 바이트 0에 있다고 믿을 수는 없습니다.http://en.wikipedia.org/wiki/MP3#File_structure) 압축 해제된 파일 크기(http://www.php.net/manual/en/function.zip-entry-filesize.php) .부풀린 파일이 너무 크거나 MP3가 아닌 파일이 있는 경우 구제합니다.

.zip 아카이브 내의 파일 이름은 다음 코드를 사용합니다.

$zip = zip_open('test.zip');

while($entry = zip_read($zip)) {
    $file_name = zip_entry_name($entry);
    $ext = pathinfo($file_name, PATHINFO_EXTENSION);
    if(strtoupper($ext) !== 'MP3') {
        notify_admin($file_name);
    }
}

다음 코드에서는 확장자만 확인할 수 있습니다.즉, 사용자는 MP3 확장자가 있는 모든 것을 업로드할 수 있습니다.파일이 mp3인지 정말 확인하려면 압축을 풀어야 합니다.저는 당신에게 임시 디렉토리에서 그것을 하는 것을 조언하고 싶습니다.

파일의 압축을 푼 후 ffmpeg 등을 사용하여 파일을 분석할 수 있습니다.비트 전송률, 트랙 라이트 등에 대한 자세한 데이터는 어떤 경우에도 흥미로울 것입니다.

분석에 실패하면 파일에 플래그를 지정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/14834270/security-of-unzipping-user-submitted-files

반응형