상수 문자열을 사용하여 system(3) 또는 popen(3)을 호출할 때의 함정은 무엇입니까?

상수 문자열을 사용하여 system(3) 또는 popen(3)을 호출할 때의 함정은 무엇입니까?

PATH, 및 일부 변수 와 같은 "문제가 있는" 환경 변수를 명시적으로 설정했다고 가정할 때 IFS값이 컴파일 타임 상수인 문자열에 AND를 사용하는 것은 얼마나 나쁜 생각입니까(Unices와 이상한 것과 같은 차이를 허용하기 위해)LC_* 비 POSIX).popensystem/bin/sh

예를 들어, 다음과 같은 코드 조각을 사용하여 현재 디렉터리의 파일에 대해 깊이 우선 검색을 수행하는 C 코드가 있는 경우 이것이 보안/정확성 관점에서 문제가 됩니까?

FILE* fh = popen("2>/dev/null /usr/bin/find . -print0 -type f");

편집: 깨끗한 환경을 강제하고 휴대용이 아닌 옵션을 포함하지 않는 예

FILE* fh = popen("2>/dev/null /usr/bin/env -i /usr/bin/find . -type f");

답변1

다음과 같이 "불쾌한" 환경 변수를 명시적으로 설정했다고 가정하면...

그러지 마세요.

프로그램이 관심을 가질 수 있는 모든 환경 변수를 식별하는 것은 약간 어렵습니다. 프로그램에 깨끗한 환경을 제공하고 필요한 변수만 설정하는 것이 더 쉽습니다.

이와 같은 간단한 명령을 실행하는 경우 다음 기능 중 하나를 사용 exec하면 다른 쉘에 대해 걱정할 필요가 없습니다.

표준 유틸리티를 호출한다는 사실을 안다면 그 유틸리티가 무엇을 하는지 확실히 알 수 있으며, 함수를 직접 구현한다면 리소스 제약 조건 등도 프로그램에 영향을 미칠 수 있습니다. 그러나 사용 중인 것과 find같은 비표준 확장 기능을 가진 일부 변형이 있으므로 -print0이를 사용하는 경우 이를 지원하는 외부 프로그램의 버전에 따라 달라집니다.

관련 정보