검출 항목과 검출 플로우

자바스크립트로 이미지 파일 내 악성 코드를 검출하는 도구를 만들 때 고려해야 할 검출 항목과 검출 플로우를 자세하게 설명하겠습니다. 자바스크립트는 클라이언트 측에서 실행되므로, 파일 전체를 분석하는 데는 제약이 있을 수 있습니다. 따라서, 서버 측 검증과 함께 사용하는 것이 좋습니다.

검출 항목:

  1. 파일 형식 검증 (File Format Validation):
    • Magic Number 확인: 파일의 시작 부분에 있는 Magic Number (파일 시그니처)를 확인하여 파일 형식이 올바른지 검증합니다. 예를 들어, JPEG 파일은 FF D8 FF로 시작하고, PNG 파일은 89 50 4E 47 0D 0A 1A 0A로 시작합니다.
    • 파일 확장자 확인: 파일 확장자가 파일 형식과 일치하는지 확인합니다. 파일 확장자는 위조될 수 있으므로, Magic Number와 함께 검증해야 합니다.
  2. 메타데이터 분석 (Metadata Analysis):
    • EXIF 데이터 분석: EXIF 데이터에 비정상적인 태그나 값이 있는지 확인합니다. 예를 들어, UserComment 태그에 실행 가능한 코드가 삽입될 수 있습니다.
    • IPTC/XMP 데이터 분석: IPTC/XMP 데이터에 비정상적인 내용이 있는지 확인합니다.
    • 메타데이터 크기 확인: 메타데이터가 과도하게 큰 경우 악성 코드 삽입을 의심할 수 있습니다.
  3. 파일 크기 분석 (File Size Analysis):
    • 비정상적인 파일 크기 확인: 파일 크기가 예상되는 범위에서 벗어나는 경우 악성 코드 삽입을 의심할 수 있습니다.
    • 파일 크기 대비 이미지 크기 확인: 파일 크기에 비해 이미지 크기가 너무 작은 경우 스테가노그래피를 의심할 수 있습니다.
  4. 엔트로피 분석 (Entropy Analysis):
    • 전체 파일 엔트로피 분석: 파일 전체의 엔트로피를 계산하여 숨겨진 데이터가 있는지 확인합니다. 높은 엔트로피는 압축되거나 암호화된 데이터가 존재할 가능성을 나타냅니다.
    • 부분 파일 엔트로피 분석: 파일의 특정 부분 (예: 메타데이터 이후)의 엔트로피를 계산하여 악성 코드 삽입 여부를 확인합니다.
  5. JavaScript 코드 검사 (JavaScript Code Inspection):
    • <script> 태그 검사: 이미지 파일 내에 <script> 태그가 있는지 확인합니다. 이미지 파일 내에 JavaScript 코드가 존재하는 것은 비정상적인 경우입니다.
    • eval() 함수 검사: eval() 함수는 문자열로 된 JavaScript 코드를 실행하므로, 악성 코드 삽입에 악용될 수 있습니다.
    • Function() 생성자 검사: Function() 생성자는 문자열로 된 함수를 생성하므로, 악성 코드 삽입에 악용될 수 있습니다.
    • Base64 디코딩 함수 검사: atob() 함수는 Base64로 인코딩된 문자열을 디코딩하므로, 악성 코드 삽입에 악용될 수 있습니다.
  6. 특정 문자열 검사 (Specific String Inspection):
    • 악성 코드 관련 문자열 검사: <?php, <%, shell_exec, system, passthru 등 악성 코드와 관련된 문자열이 있는지 확인합니다.
    • 난독화된 문자열 검사: \x, \u 등 난독화된 문자열이 있는지 확인합니다.

검출 플로우:

  1. 파일 읽기:
    • FileReader API를 사용하여 이미지 파일을 읽습니다.
    • 파일을 ArrayBuffer 또는 Data URL로 읽을 수 있습니다.
  2. 파일 형식 검증:
    • ArrayBuffer에서 Magic Number를 읽어 파일 형식을 확인합니다.
    • 파일 확장자를 확인합니다.
  3. 메타데이터 분석:
    • exif-js 라이브러리 또는 유사한 라이브러리를 사용하여 EXIF 데이터를 추출합니다.
    • IPTC/XMP 데이터를 추출합니다.
    • 추출된 메타데이터를 분석하여 비정상적인 값을 확인합니다.
  4. 파일 크기 분석:
    • 파일 크기를 확인합니다.
    • 파일 크기 대비 이미지 크기를 확인합니다.
  5. 엔트로피 분석:
    • ArrayBuffer를 사용하여 파일의 엔트로피를 계산합니다.
    • 전체 파일 엔트로피와 부분 파일 엔트로피를 비교합니다.
  6. JavaScript 코드 검사:
    • 파일 내용에서 <script> 태그, eval() 함수, Function() 생성자, atob() 함수 등을 검색합니다.
  7. 특정 문자열 검사:
    • 파일 내용에서 악성 코드 관련 문자열 및 난독화된 문자열을 검색합니다.
  8. 결과 보고:
    • 검출된 악성 코드 의심 항목을 보고합니다.
    • 각 항목에 대한 위험도를 표시합니다.

자바스크립트 코드 예시 (일부):

// 파일 읽기
const reader = new FileReader();
reader.onload = function(event) {
  const arrayBuffer = event.target.result;
  const uint8Array = new Uint8Array(arrayBuffer);

  // Magic Number 확인 (JPEG)
  if (uint8Array[0] === 0xFF && uint8Array[1] === 0xD8 && uint8Array[2] === 0xFF) {
    console.log("JPEG 파일");
  }

  // 엔트로피 계산 (간단한 예시)
  let entropy = 0;
  const histogram = new Array(256).fill(0);
  for (let i = 0; i < uint8Array.length; i++) {
    histogram[uint8Array[i]]++;
  }
  for (let i = 0; i < 256; i++) {
    const probability = histogram[i] / uint8Array.length;
    if (probability > 0) {
      entropy -= probability * Math.log2(probability);
    }
  }
  console.log("엔트로피:", entropy);

  // JavaScript 코드 검사
  const fileContent = new TextDecoder().decode(arrayBuffer);
  if (fileContent.includes("<script>")) {
    console.log("JavaScript 코드 발견");
  }
};
reader.readAsArrayBuffer(file);

주의 사항:

  • 자바스크립트는 클라이언트 측에서 실행되므로, 악성 코드 검출에 한계가 있습니다.
  • 악성 코드 검출 로직은 우회될 수 있으므로, 지속적인 업데이트가 필요합니다.
  • 서버 측 검증과 함께 사용하여 보안을 강화하는 것이 좋습니다.

이 정보가 자바스크립트 악성 코드 검출 도구를 개발하는 데 도움이 되기를 바랍니다.

답글 남기기