안전하지 않은 임시 파일 생성

Insecure Temporary File

설명

Insecure Temporary File 취약점은 /tmp 같은 공유 디렉터리에서 임시 파일을 만들 때, 안전한 랜덤 이름이나 적절한 권한 설정 없이 고정된 경로나 예측 가능한 파일 이름을 사용하는 경우 발생합니다. 이때 공격자는 같은 이름의 파일을 미리 만들어 두거나 심볼릭 링크를 걸어 두어, 프로그램이 해당 파일에 쓰기를 시도할 때 다른 파일(예: 설정 파일, 인증 정보 파일 등)을 덮어쓰게 만들 수 있습니다. 또한 다른 사용자나 프로세스가 임시 파일 내용을 읽거나 수정할 수 있어 정보 유출이나 데이터 변조로 이어질 수 있습니다.

잠재적 영향

  • 데이터 변조 (Data Modification, 데이터 변경): 공격자가 같은 이름의 파일을 미리 만들거나 심볼릭 링크를 사용해, 애플리케이션이 쓰려는 데이터를 다른 파일에 기록하게 만들 수 있습니다. 이로 인해 설정 파일, 로그 파일 등이 의도치 않게 변경될 수 있습니다.

  • 정보 유출 (Information Disclosure, 정보 노출): 공유 디렉터리에 생성된 임시 파일의 권한이 적절히 제한되지 않으면, 다른 사용자나 프로세스가 해당 파일을 읽어 민감한 정보를 획득할 수 있습니다.

  • 권한 남용 및 우회 (Privilege Misuse): 높은 권한으로 실행되는 프로그램이 /tmp에 임시 파일을 잘못 생성하면, 공격자가 이를 악용해 시스템 파일을 덮어쓰는 등 권한을 우회하거나 확대하는 공격 시나리오로 이어질 수 있습니다.

해결 방법

  • 안전한 임시 파일 API 사용: Go에서는 os.CreateTemp 또는 ioutil.TempFile(내부적으로 os.CreateTemp 사용)을 사용해, 충돌 가능성이 낮은 랜덤 파일명을 가진 임시 파일을 생성합니다.

  • 고정 경로나 파일명 사용 금지: "/tmp/myfile" 같이 예측 가능한 이름을 직접 쓰지 말고, prefix만 정하고 나머지는 라이브러리에서 랜덤으로 생성하게 합니다.

  • 최소 권한 설정: 임시 파일에 저장하는 데이터가 민감하다면, 파일 권한을 0600 등 최소 권한으로 설정해 다른 유저가 읽지 못하도록 합니다.

  • 사용 후 즉시 삭제: 더 이상 필요 없는 임시 파일은 os.Remove를 이용해 가능한 빨리 삭제합니다.

  • 민감 정보 저장 자제: 비밀번호, 토큰, 개인 정보 등 매우 민감한 데이터는 가능한 한 파일 시스템 임시 파일에 저장하지 않고 메모리 내에서만 처리하거나, 별도의 보안 스토리지를 사용합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: non_compliant 코드에서는 /tmp/report.log 처럼 공유 디렉터리(/tmp)에 고정된 파일 이름을 직접 사용하여 파일을 생성합니다. 이 경우:

  • 다른 사용자가 동일한 이름의 파일을 미리 만들거나 심볼릭 링크를 걸어둘 수 있어, 프로그램이 의도하지 않은 위치에 데이터를 쓰게 될 수 있습니다.

  • 기본 파일 권한으로 인해 다른 사용자나 프로세스가 파일 내용을 읽거나 수정할 위험이 있습니다.

  • 여러 프로세스가 동시에 실행되면 이름 충돌로 인해 예기치 않은 동작이 발생할 수 있습니다.

  • 안전한 코드: compliant 코드에서는 os.CreateTemp를 사용해 /tmp 디렉터리에 랜덤한 이름의 임시 파일을 생성합니다. 이를 통해:

  • 파일 이름이 예측하기 어려워, 공격자가 미리 같은 이름의 파일이나 심볼릭 링크를 준비하기 어렵습니다.

  • 생성된 파일의 경로를 얻은 뒤 os.Chmod로 권한을 0600으로 제한해, 다른 사용자의 접근을 막습니다.

  • 사용이 끝난 뒤 os.Remove를 통해 파일을 삭제하도록 하여, 임시 파일이 장기간 남아 악용될 가능성을 줄입니다. 이와 같은 방식으로 공유 디렉터리에서 임시 파일을 사용할 때 발생하는 보안 위험을 크게 완화할 수 있습니다.

참조

Last updated