OpenBSD 개발자인 Marc Espie와의 인터뷰가 O'Reilly Network에
올라왔다.
http://www.onlamp.com/pub/a/bsd/2004/03/18/marc_espie.html
----------
소스코드 검사는 끝이 없는 과정이다.
* 어떤이가 소프트웨어에서 문제를 발견한다.
* 어떤이가 나쁘게 이용할 수 있는지 여부와 관계없이 버그를 수정한다.
* 어떤이가 버그 원인을 알린다. (대다수의 버그는 개발자가 특정 API를
이해하지 못해서 발생한 문제다.)
* 어떤이가 전체 소스코드에서 해당 버그가 또 있는지 살펴본다.
* 어떤이가 문서에 이 문제에 대한 경고를 추가할지 알아본다.
* 어떤이가 컴파일러가 이 문제를 발견할 수 있는지 알아본다.
* 어떤이가 소스코드를 새로운 검사기에 적용하여, 고쳐야 할 문제를
찾고, 고친다.
* 어떤이는 인터페이스가 잘못 설계되었는지 여부와 버그가 덜 발생할
좋은 인터페이스가 가능한지 알아본다.
----------
static bounds checker (gcc 확장)
특정 함수의 파라미터를 연관시켜서, 다음과 같은 코드를 검사할 수 있다.
char buffer[BUFSIZE];
...
read(fd, buffer, BUFSIZE * 2);
참고: http://marc.theaimsgroup.com/?l=openbsd-cvs&m=105665219927976&w=2
----------
IBM의 Hiroaki Etoh가 StackGuard를 개량하여 ProPolice라는 gcc
확장을 만들었다. ProPolice는 stack에 할당한 buffer 주위에 "canary"를
추가하고, 자주 값이 변경되었는지 검사한다. 변경되었다면 프로그램을
조기에 종료한다. OpenBSD에 ProPolice를 적용하면서 매우 많은 버그를
발견하였다.
("canary"는 예전 광산에서 새장을 들고 내려가면서 어느위치까지 새가
우는지를 보고 공기를 검사한 점에서 따왔다.)
----------
W^X는 메모리 영역이 쓰기 가능하면서 동시에 실행가능하지 않도록 한다.
* stack은 보통 실행가능하지 않다.
* 외부 라이브러리를 참조하는 코드 영역인 relocation은 ld.so만
쓰기가능하며, 작업을 마친후 실행가능 쓰기불가로 바뀐다. 그래서
일반 프로그램 영역과 relocation 영역을 분리해야 한다 (i386이
a.out에서 ELF로 변경한 이유).
----------