system() API를 사용한 명령 주입 방지

system() API를 사용한 명령 주입 방지

권한이 낮은 사용자가 에스컬레이션된 권한으로 사용자 정의 스크립트를 실행할 수 있도록 하는 데 사용되는 레거시 C 코드가 있습니다. 여기에는 SUID 비트가 설정되어 있습니다. 이 코드는 PATH 환경을 특정 폴더로 제한한 다음 system()api를 사용하여 제한된 쉘로 스크립트를 실행합니다.

/bin/bash -r -c "script <arg>"

경로가 제한되어 있으므로 해당 특정 폴더의 스크립트만 실행할 수 있습니다.

이제 API를 사용한 명령 주입의 모든 함정을 알았으니 system()명령 주입을 피하기 위해 어떤 조치를 취할 수 있습니까? 이는 다양한 스크립트 등 여러 곳에서 사용되므로 회귀를 피하기 위해 완전히 새로운 구현을 수행하고 싶지 않습니다.

답변1

올바른 작업이 어렵기 때문에 코드에서 SUID를 제거하는 것이 좋습니다. 를 사용하도록 C 코드를 변경하세요 sudo. sudo를 사용하면 보안 시스템 프로그래밍을 얻는 더 어려운 측면이 완료됩니다.

그런 다음 visudo를 사용하여 작업을 수행하는 데 필요한 최소한의 작업을 수행하고 이를 필요한 사용자/그룹으로 제한하는 sudo 구성을 신중하게 구성할 수 있습니다. sudo를 구성한 후 다른 사람에게 테스트를 요청하고 의도한 제약을 깨도록 하세요.

답변2

코드 삽입을 위해서는 사용자가 임의의 문자열을 system()호출에 대한 매개변수로 전달할 수 있는 능력이 필요합니다. 이는 SQL 주입과 매우 유사하며 비슷한 방식으로 피해야 합니다. 사용자 정의 문자열을 호출에 직접 전달하지 마세요.

  • 숫자 매개변수는 정수로 변환되어야 하며, 호출 시 다시 문자열로 변환되어야 합니다.

  • 고정 사전에 속하는 매개변수는 "enum" 값 또는 이와 유사한 값으로 변환된 다음 호출 시 문자열로 다시 변환되어야 합니다.

  • 자유 텍스트 입력은 가능한 경우 공격적이지 않은 문자 집합으로 제한되어야 합니다(예: [a-zA-Z0-9]*). 문제가 있는 문자(공백 포함)가 필요한 경우 적절한 이스케이프를 적용해야 합니다(즉, 등 a b으로 대체해야 함 a\ b).

관련 정보