10.4. 사용자가 기억하는 비밀 (패스워드 및 키) 을 특히 보호해라

애플리케이션이 패스워드 또는 비공개 키 (세션키, 개인키, 비밀키 등) 를 다뤄야 한다면 이들이 최소한으로 노출되도록 사용한 후 즉각적으로 겹쳐써라. 예를 들어 자바에서 패스워드를 저장하기 위해 문자열 (Sting) 타입을 사용하지 마라 이들은 불변 (immutable) 이기 때문에 가비지 수집 (garbage collection) 및 재사용되기까지 아마도 차후 어느 정도 시간까지는 겹쳐써지지 않을 것이다. 대신 자바에서는 패스워드가 즉시 겹쳐써질 수 있도록 이를 저장하기 위해 char[] 을 사용해라.

또한 프로그램이 그러한 비밀 값들을 다룬다면 ulimit 를 통해 반드시 코어 덤프 생성을 금지해라. 그렇지 않으면 공격자가 프로그램을 정지시켜 데이타 덤프에서 비밀 값을 발견할 수 있을지 모른다. 또한 주의해라 - 일반적으로 프로세스들은 디버거 (예, ptrace(2) 및 /proc 준-파일시스템을 통해) 호출을 통해 다른 프로세스들을 모니터링 할 수 있다 [Venema 1996]. 커널은 프로세스가 setuid 또는 setgid 라면 이러한 모니터링에 대해 보통 보호를 한다 (이러한 보호를 하지 않는 약간의 오래된 시스템에서는 실제로 갱신이외에는 보호할 방법이 없다). 따라서 프로세스가 비밀 값들을 관리한다면 이러한 종류의 모니터링을 강제적으로 금지하기 위해 이를 다른 권한이 없는 그룹 또는 사용자에 대해 setuid 또는 setgid 로 만들어야 한다.