설명
Process로 셸을 실행하면서 -c 뒤에 사용자 입력을 전달하면 셸 문법이 해석되어 임의 명령 실행으로 이어질 수 있습니다. 셸을 사용하지 않더라도 사용자가 실행 파일 경로를 선택하게 하거나 프로그램의 옵션을 제어하게 하면 의도하지 않은 작업이 실행될 수 있습니다.
잠재적 영향
- 임의 명령 실행
- 파일 읽기, 삭제, 외부 전송
- 서버 또는 개발자 장비 권한 탈취
해결 방법
- 셸을 거치는
-c실행을 피하고 실행 파일은 고정 경로로 지정합니다. - 인자는
Process.arguments배열로 분리하고 값마다 허용 목록 검증을 적용합니다. - 불가피하게 셸 문자열을 만들어야 하면 검증된 이스케이프 함수를 사용하고 가능한 권한을 낮춥니다.
예시
변경 전
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()
}
설명:
- 변경 전: 이 설정으로 프로세스를 실행하면 입력 전체가 셸 명령으로 해석됩니다.
- 변경 후: 실행 파일과 하위 명령을 고정하고
--뒤에 사용자 값을 전달해 셸 해석과 옵션 인젝션을 모두 방지합니다.