네트워크 데이터의 로컬 파일 저장

네트워크 데이터의 로컬 파일 저장

설명

외부 네트워크 응답 데이터를 검증 없이 로컬 파일에 저장하면 임의 파일 업로드 또는 신뢰 경계 우회로 이어질 수 있습니다. 이후 애플리케이션이 해당 파일을 신뢰하고 실행, 파싱, 제공하면 공격자가 악성 스크립트나 조작된 데이터를 서버 파일 시스템에 주입할 수 있습니다.

잠재적 영향

  • 공격자가 제어하는 파일이 서버에 저장되어 악성 코드, 스크립트, 조작된 데이터가 배포될 수 있습니다.
  • 정적 제공 디렉터리나 실행 가능한 위치에 파일이 저장되면 후속 공격의 발판이 될 수 있습니다.
  • 대용량 응답 저장으로 디스크 고갈이나 서비스 거부가 발생할 수 있습니다.

해결 방법

  • 외부 네트워크 응답을 파일로 저장하기 전에 출처, 콘텐츠 타입, 크기, 확장자, 파일 매직 바이트를 검증하세요.
  • 저장 위치는 전용 격리 디렉터리로 제한하고 실행 가능한 경로나 정적 제공 경로에 직접 쓰지 마세요.
  • 필요하면 악성코드 검사, 허용 목록 기반 다운로드 대상과 신뢰한 키를 이용한 서명 검증을 추가하세요.

예시

변경 전

javascript
const fs = require("fs");
const axios = require("axios");

async function download(url) {
  const response = await axios.get(url);
  fs.writeFileSync("/var/www/public/file.bin", response.data);
}

변경 후

validateDownload와 verifySignature는 구현이 생략된 애플리케이션별 검증 함수입니다. 검증 기준과 신뢰한 서명 키를 정하고, 다운로드 중 크기·시간도 제한하세요. 저장 디렉터리는 공격자가 수정할 수 없도록 보호해야 합니다.

javascript
const fs = require("fs");
const axios = require("axios");

async function download(url) {
  const response = await axios.get(url, { responseType: "arraybuffer" });
  const payload = validateDownload(response.data, response.headers);
  await verifySignature(payload);
  fs.writeFileSync("/srv/app/downloads/file.bin", payload, { mode: 0o600 });
}

설명:

  • 변경 전: 외부 응답을 검증 없이 웹 공개 경로에 저장해 공격자가 조작한 파일이 제공될 수 있습니다.
  • 변경 후: 응답 내용과 서명을 검증한 뒤 격리된 위치에 기록합니다. mode: 0o600은 새 파일 생성 시의 권한이며, 기존 파일의 권한을 바꾸지는 않습니다.

참조