What we have to do is to be forever curiously
testing new opinions and courting new impressions

우리가 해야 할 일은 끊임없이 호기심을 갖고
새로운 생각을 시험해보고 새로운 인상을 받는 것

Supply Chain Attack에 대해

  • Left-Pad 이슈
  • 정의
  • 예시
  • 대처


Left-Pad 이슈

개발자에게 가장 중요한 자산은 시간

그렇기 때문에 작업을 시작하기 전 비슷한 작업에 쓰인 코드가 있는지 검색해보고 유사한 작업을 수행하는 코드를 찾거나 패키지를 설치해서 직접 코딩하는 것보다 작업시간을 단축시키려는 노력을 함

그런 연유로 많은 개발자들은 기완성된 코드에 지나치게 의존하는 모습을 보이기도 하는데, Left-Pad 이슈가 그런 예시

Left-Pad는 자바스크립트에서 쓰이며, 텍스트 문자열에 왼쪽 패딩을 추가해주는 단 11줄의 코드였지만, 많은 개발자들은 작업을 할 때 Left-Pad의 의존성을 추가하여 편리하게 작업했었음

module.exports = leftpad;

function leftpad (str, len, ch) {
    str = String(str);
    var i = -1;
    if (!ch && ch !== 0) ch = ' ';
    len = len - str.length;
    while (++i < len) {
        str = ch + str;
    }
    return str;
}

그러던 중 이 Left-Pad라는 패키지가 비공개로 전환되자, 이에 의존하던 수많은 프로젝트들이 깨짐

이를 통해 수많은 개발자들이 작업시간을 단축하기 위해 기완성된 패키지를 얼마나 많이 설치하고 사용하는 지 깨달음

공격자의 입장에서 Left-Pad 이슈는 자신의 코드를 간접적으로 타인의 작업에 포함시켜 해당 서버를 악의적으로 이용할 수 있게 하는 데 영감을 주게 된 사건


정의

서버를 직접적으로 공격하지 않고, 악의적 목적으로 개발자들이 자주 의존하는 패키지 공급망을 공격하여, 해당 패키지를 의존하는 소프트웨어를 실행하는데 사용하는 구성 요소(서버, 컴퓨터와 자격 증명)를 손상시키는 공격 방식


예시

1. npm 계정 공격

개발자들이 의존하는 코드를 게시하는 특정 계정 중 사설 도메인의 이름을 사용하는 계정을 찾아, 사설 도메인의 계약 기간이 만료되면 해당 계정을 하이재킹해, 악의적으로 작동하는 코드를 라이브러리에 푸쉬하는 방법이 있음

2. 유사 package 이름 공격

기존에 있는 유명 패키지에 접두사나 접미어를 붙여 마치 정식 패키지인 것처럼 착각하게 하여, 개발자가 실수로 악성 코드가 포함된 패키지를 다운로드 하기를 바라는 공격 방식

실제로 npm에서 자주 사용되는 MathJS 패키지가 있음

공간을 덜 차지하는 압축된 버전의 패키지라는 의미의 ‘-min’을 붙인 패키지가 올라옴

mathjs-min은 MathJS의 정식 압축 패키지가 아닌, 공격자가 만든 사용자의 디스코드 토큰을 빼가는 악성 맬웨어였음

3. typosquatting 공격

공격자가 정상 패키지와 매우 유사한 이름의 패키지에 악성 코드를 업로드하여, 개발자가 실수로 악성 코드가 포함된 패키지를 다운로드 하기를 바라는 공격 방식

파이썬에서 주로 쓰이는 selenium이라는 패키지가 있는데, 이와 아주 유사한 이름의 철자를 가지는 패키지들을 악성코드를 심어서 게시하고 개발자들이 사용하게끔 유도함


대처

  1. 공격에 노출되면 표면적을 줄이도록, 가장 필요한 서드파티 패키지만 설치
  2. 설치하려는 패키지의 이름을 명확하게 알고, 정확한 철자를 입력하여 사용
  3. 설치 전과 후에 스크립트의 자동 실행을 막기 위해 패키지 매니저 설정 혹은 소프트웨어의 권한 제한 설정
  4. 패키지 매니저 업데이트를 통한 최신 버전 사용
  5. 개인 파일과 격리된 컨테이너(Docker) 내부에서 작업 실행


댓글남기기