![상수 문자열을 사용하여 system(3) 또는 popen(3)을 호출할 때의 함정은 무엇입니까?](https://linux55.com/image/107536/%EC%83%81%EC%88%98%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20system(3)%20%EB%98%90%EB%8A%94%20popen(3)%EC%9D%84%20%ED%98%B8%EC%B6%9C%ED%95%A0%20%EB%95%8C%EC%9D%98%20%ED%95%A8%EC%A0%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
PATH
, 및 일부 변수 와 같은 "문제가 있는" 환경 변수를 명시적으로 설정했다고 가정할 때 IFS
값이 컴파일 타임 상수인 문자열에 AND를 사용하는 것은 얼마나 나쁜 생각입니까(Unices와 이상한 것과 같은 차이를 허용하기 위해)LC_*
비 POSIX).popen
system
/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
이를 사용하는 경우 이를 지원하는 외부 프로그램의 버전에 따라 달라집니다.