The end of a matter is better than its beginning, and patience is better than pride. | |
Ecclesiastes 7:8 (NIV) |
정말 보안적인 프로그램을 설계하고 구현하는 것은 리눅스 및 유닉스와 같은 유닉스 계열 시스템에서는 실제로 어려운 작업인데 정말 보안적인 프로그램이 잠재적으로 악의있는 사용자가 제어하는 모든 가능한 입력과 환경에 적절하게 응답해야 한다는 것은 어렵다. 보안적인 프로그램 개발자들은 프로그램의 취약성을 줄이기 위해 각자의 플랫폼을 깊게 이해하고 지침들을 찾아 사용한 후 세부 검토 (peer review) 와 같은 보증 프로세스를 사용해야 한다.
결론적으로 다음은 이 책에서 기술한 주요 지침들의 일부이다:
커맨드 라인 입력, 환경 변수, CGI 입력 등 모든 입력을 확인해라. 틀린 입력을 그저 거절하지 마라; 무엇이 수용가능한 입력인지를 정의하고 일치하지 않는 모든 것을 거절해라.
버퍼 오버플로우를 피해라. 긴 입력 (과 긴 중간 데이타 값) 이 프로그램을 비정상적으로 동작시키는데 사용될 수 없음을 확인해라. 이는 현재 기본적인 프로그램적인 에러이다.
프로그램 내부를 구조화해라. 인터페이스를 안전하게 하고 권한을 최소로 하며 초기설정과 디폴트를 안전하게 만들고 오류시 자동적으로 정상상태로 돌아가게 해라 (fail-safe). 경쟁 상태를 피해라 (예, /tmp 와 같은 공유 디렉토리내의 모든 파일들을 안전하게 오픈함으로써). 단지 신뢰할 수 있는 채널만을 신뢰해라 (예, 대부분의 서버가 보안 검사 또는 구입시 아이템 가격과 같은 기밀을 다루는 데이타에 대해 클라이언트를 신뢰하지 않아야 한다.)
주의깊게 다른 자원들을 호출해라. 이들의 값들을 유효한 값들로 제한하고 (특히 메타문자에 주의해라) 모든 시스템 호출 반환 값들을 검사해라.
정보를 신중하게 응답해라. 특히 피드백을 최소화하고 신뢰할 수 없는 사용자에 대해 완전하거나 무반응의 출력을 다뤄라.