9.2. 펄

펄 프로그래머들은 보안적인 프로그램 작성과 관련된 많은 문제점들을 설명하는 perlsec(1) 맨 페이지를 우선 읽어야 한다. 특히 perlsec(1) 은 대부분의 보안적인 펄 프로그램들이 사용해야 하는 "taint" 모드를 설명하고 있다. Taint 모드는 real 과 effective 사용자 또는 그룹 ID 가 다르면 자동적으로 허가되며 또한 -T 커맨드 라인 플래그를 사용할 수도 있다 (CGI 스크립트와 같이 어떤 누구가를 대신해 작동시킨다면 이를 추후에 사용해라). Taint 모드는 경로 디렉토리들이 others 가 write 허가권이 없음을 확인하기 위해 이들의 검사와 같은 다양한 검사들을 켠다.

Taint 모드의 가장 명백한 영향은 프로그램 외부의 어떤 무언가에 우연히 영향을 끼칠 수있는 프로그램 외부로부터 파생된 데이타를 사용하지 못할 수도 있다는 것이다. Taint 모드에서 모든 외부로부터 얻은 입력은 "tainted" 로 표시되며 이에는 커맨드 라인 인수, 환경 변수, 로케일 정보 (perllocale(1) 을 보라), 어떤 시스템 호출의 결과 (readdir, readlink, getpw* 호출의 gecos 필드) 와 모든 파일 입력들이 있다. Tainted 데이타는 서브 쉘을 호출하는 모든 명령 또는 파일, 디렉토리 또는 프로세스를 변경하는 모든 명령에서 직접적 또는 간접적으로 사용되지 못할 수 있다. 한가지 중요한 예외도 있는데 인수 목록을 system 또는 exec 에 건네준 경우 그 목록의 요소들은 tainedness 에 NOT 으로 체크된다. 따라서 taint 모드에서 system 또는 exec 에 특히 주의해라.

Tainted 데이타로부터 파생된 모든 데이타 값도 또한 tainted 된다. 한가지 예외가 있는데 데이타를 untainting 하는 방법은 tainted 데이타로부터 서브 문자열을 추출하는 것이다. 그렇지만 마구잡이로 그저 ".*" 를 서브 문자열로 사용하지 마라 이는 tainting 메카니즘의 보호를 무너뜨릴 수도 있다. 대신 프로그램이 허용하는 ``안전한" 패턴으로 확인된 패턴들만을 식별하고 이들을 사용해 "확실한" 값들을 추출해라. 값을 추출한 후라도 이를 검사할 필요가 있다 (특히 길이에 대해 검사할 필요가 있다).

open, glob 와 backtick 함수들은 파일 이름의 와일드카드 문자들을 확장하기 위해 쉘을 사용하는데 이는 보안 구멍을 열기 위해 사용될 수 있다. 이러한 함수들을 전적으로 피하거나 perlsec(1) 에 기술된 것과 같이 권한이 적은 sandbox 에서 이들을 사용할 수 있다. 특히 backtick 은 system() 호출을 사용해 재작성되어야 한다 (또는 더욱 좋은 방법으로는 완전히 더욱 안전한 것으로 변경되어야 한다).

펄의 open() 함수는 솔직히 대부분의 보안적인 프로그램에 대해 ``너무나 이상한 방식" 으로 작동하는데 이는 텍스트가 주의깊게 필터링되지 않는다면 많은 보안 문제를 야기할 수 있는 텍스트를 해석한다. 파일 오픈 또는 로크하는 코드를 작성하기 전에 perlopentut(1) 맨 페이지를 참조해라. 대부분의 경우 sysopen() 은 파일 오픈에 더욱 복잡함에도 불구하고 더욱 안전한 방법을 제공하는데 새로운 펄 5.6 에는 매우 복잡한 sysopen() 기능을 필요로 함이 없이 이상한 거동을 끄기 위해 3개의 매개변수를 갖는 open() 호출이 추가되어 있다..

펄 프로그램은 잠재적으로 위험하거나 쓸모없는 문장들을 경고하는 경고 플래그 (-w) 를 켜야 한다.

제한된 환경에서 펄 프로그램을 실행시킬 수도 있는데 더욱 자세한 정보는 표준 펄 배포판에서 "Safe" 모듈을 보라. 저자는 이 모듈이 수행하는 감사의 양을 분명히 모르는데 따라서 보안을 위해 이 모듈을 주의해서 사용해라. 또한 "Penguin Model for Secure Distributed Internet Scripting" 를 고찰할 수도 있다. 그러나 이 문서 작성시점에서 코드와 문서가 도움이 되지 않는 것같다.