Swift 명령어 인젝션

Swift 명령어 인젝션

설명

Process로 셸을 실행하면서 -c 뒤에 사용자 입력을 전달하면 셸 문법이 해석되어 임의 명령 실행으로 이어질 수 있습니다. 셸을 사용하지 않더라도 사용자가 실행 파일 경로를 선택하게 하거나 프로그램의 옵션을 제어하게 하면 의도하지 않은 작업이 실행될 수 있습니다.

잠재적 영향

  • 임의 명령 실행
  • 파일 읽기, 삭제, 외부 전송
  • 서버 또는 개발자 장비 권한 탈취

해결 방법

  1. 셸을 거치는 -c 실행을 피하고 실행 파일은 고정 경로로 지정합니다.
  2. 인자는 Process.arguments 배열로 분리하고 값마다 허용 목록 검증을 적용합니다.
  3. 불가피하게 셸 문자열을 만들어야 하면 검증된 이스케이프 함수를 사용하고 가능한 권한을 낮춥니다.

예시

변경 전

swift
let command = readLine()!
let task = Process()
task.launchPath = "/bin/sh"
task.arguments = ["-c", command]

변경 후

swift
import Foundation

func runGitStatus(for path: String) throws {
    let task = Process()
    task.executableURL = URL(fileURLWithPath: "/usr/bin/git")
    task.arguments = ["status", "--", path]
    try task.run()
    task.waitUntilExit()
}

설명:

  • 변경 전: 이 설정으로 프로세스를 실행하면 입력 전체가 셸 명령으로 해석됩니다.
  • 변경 후: 실행 파일과 하위 명령을 고정하고 -- 뒤에 사용자 값을 전달해 셸 해석과 옵션 인젝션을 모두 방지합니다.

참조