Secure Programming for Linux and Unix HOWTO

David A. Wheeler

서정룡

s_ryong@hotmail.com

송재숙

affinity@orgio.net

v2.92, 8 January 2002

이 책은 리눅스와 유닉스 시스템에서 보안적인 프로그램을 작성하기 위한 일련의 설계 및 구현 지침들을 제공한다. 보안적인 프로그램들은 원격 데이타 뷰어로 사용되는 애플리케이션 프로그램, CGI 스크립트를 포함한 웹 애플리케이션, 네트워크 서버와 setuid/setgid 프로그램들을 포함한다. C, C++, 자바, 펄, PHP, 파이썬, TCL 과 Ada95 에 대한 명확한 지침도 포함된다.

고친 과정
고침 v2.92수정일 2002-1-22고친이 JRSoh
2.86 에서 2.92 버전으로 갱신하였습니다.

차례
1. 소개
2. 배경
2.1. 유닉스, 리눅스, 오픈 소스/자유 소프트웨어의 역사
2.1.1. 유닉스
2.1.2. 자유 소프트웨어 재단
2.1.3. 리눅스
2.1.4. 오픈 소스/자유 소프트웨어
2.1.5. 리눅스와 유닉스 비교
2.2. 보안 원리
2.3. 프로그래머들은 왜 비보안적인 코드를 작성하는가
2.4. 오픈 소스가 보안에 유리한가?
2.5. 보안적인 프로그램 타입
2.6. 편집증은 미덕이다
2.7. 이 문서를 작성한 이유는?
2.8. 설계와 구현 지침의 출처
2.9. 보안 정보의 다른 출처들
2.10. 문서 관행
3. 리눅스 및 유닉스 보안 특징들의 요약
3.1. 프로세스
3.1.1. 프로세스 속성
3.1.2. POSIX Capabilities
3.1.3. 프로세스 생성과 조작
3.2. 파일
3.2.1. 파일시스템 객체 속성
3.2.2. 생성시 초기값
3.2.3. 접근 제어 속성 변경
3.2.4. 접근 제어 속성 사용
3.2.5. 파일시스템 계층구조
3.3. System V 프로세스간 통신
3.4. 소켓과 네트워크 연결
3.5. 시그널
3.6. 쿼터와 한도
3.7. 동적 링크 라이브러리
3.8. 감사
3.9. PAM
3.10. 유닉스 계열 시스템을 위한 전문적인 보안 확장
4. 모든 입력을 확인해라
4.1. 명령 행
4.2. 환경 변수
4.2.1. 몇몇 환경 변수는 위험하다
4.2.2. 환경 변수 저장 포맷은 위험하다
4.2.3. 해결방안 - 추출 및 제거
4.3. 파일 기술자
4.4. 파일 컨텐츠
4.5. 웹 기반 애플리케이션 입력 (특히 CGI 스크립트)
4.6. 다른 입력
4.7. 인간 언어 (로케일) 선택
4.7.1. 로케일 선택 방법
4.7.2. 로케일 지원 메카니즘
4.7.3. 합법적인 값
4.7.4. 최종 결과
4.8. 문자 인코딩
4.8.1. 문자 인코딩 소개
4.8.2. UTF-8 소개
4.8.3. UTF-8 보안 쟁점
4.8.4. UTF-8 합법적인 값
4.8.5. UTF-8 관련 쟁점
4.9. 입력에서 교차 사이트의 악의있는 컨텐트를 예방해라
4.10. 다시 보내질 수도 있는 HTML/URIs 를 필터링해라
4.10.1. 몇몇 HTML 데이타를 제거 및 금지해라
4.10.2. HTML 데이타 인코딩
4.10.3. HTML 데이타 확인
4.10.4. 하이퍼텍스트 링크 (URIs/URLs) 확인
4.10.5. 다른 HTML 태그
4.10.6. 관련 쟁점
4.11. 비질의를 수행하는 HTTP GET 을 금지해라
4.12. 합당한 입력 시간 및 로드 레벨을 제한해라
5. 버퍼오버플로우 피하기
5.1. C/C++ 에서의 위험
5.2. C/C++ 에서의 라이브러리 솔루션
5.2.1. 표준 C 라이브러리 솔루션
5.2.2. 정적 및 동적 할당 버퍼
5.2.3. strlcpy and strlcat
5.2.4. libmib
5.2.5. C++ std::string class
5.2.6. Libsafe
5.2.7. 다른 라이브러리
5.3. C/C++ 에서의 컴파일 솔루션
5.4. 다른 언어
6. 프로그램 내부 구조화 및 접근 방법
6.1. 보안적인 프로그램에 대해 훌륭한 소프트웨어 엔지니어링 원리를 따르라
6.2. 인터페이스를 안전하게 해라
6.3. 권한을 최소화해라
6.3.1. 허가되는 권한을 최소화해라
6.3.2. 권한이 사용될 수 있는 시간을 최소화해라
6.3.3. 권한이 필요한 시간을 최소화해라
6.3.4. 권한이 허가된 모듈을 최소화해라
6.3.5. 권한을 제한하기 위해 FSUID 사용을 고려해라
6.3.6. 사용할 수 있는 파일을 최소화하기 위해 Chroot 사용을 고려해라
6.3.7. 접근할 수 있는 데이타의 최소화를 고려해라
6.3.8. 사용가능한 자원의 최소화를 고려해라
6.4. Setuid/Setgid 스크립트 생성을 피해라
6.5. 안전하게 설정하고 안전한 디폴트를 사용해라
6.6. 안전하게 초기화값을 적재해라
6.7. 고장 안전
6.8. 경쟁 상태를 피해라
6.8.1. 시퀀싱 (비원자적) 문제
6.8.1.1. 파일시스템에서의 원자적 동작
6.8.1.2. 임시 파일
6.8.2. 로킹
6.8.2.1. 로크로서 파일 사용
6.8.2.2. 로킹에 대한 다른 접근 방법
6.9. 단지 신뢰할 수 있는 체널만 신뢰해라
6.10. 신뢰된 경로를 설정해라
6.11. 내부의 일관성을 검사하는 코드를 사용해라
6.12. 스스로 자원을 제한해라
6.13. 교차 사이트의 악의있는 컨텐트를 예방해라
6.13.1. 문제 설명
6.13.2. 교차 사이트의 악의있는 컨텐트에 대한 해결방안
6.13.2.1. 특별 문자 식별
6.13.2.2. 필터링
6.13.2.3. 인코딩
6.14. 데이타 타입에 주의해라
7. 다른 자원을 주의깊게 호출해라
7.1. 안전한 라이브러리 루틴만 호출해라
7.2. 호출을 합당한 값으로 제한해라
7.3. 프로그래머가 사용하도록 의도된 인터페이스만 호출해라
7.4. 모슨 시스템 호출 반환을 검사해라
7.5. vfork(2) 사용을 피해라
7.6. 내장된 컨텐트를 검색할 때 웹버그에 대처해라
7.7. 기밀을 다루는 정보를 숨겨라
8. 정보를 신중하게 되돌려줘라
8.1. 피드백을 최소화해라
8.2. 주석을 포함하지 마라
8.3. 완전한/무반응의 출력을 다뤄라
8.4. 데이타 포맷팅을 제어해라 (문자열 포맷)
8.5. 출력에서 문자 인코딩을 제어해라
8.6. 포함/설정 파일 접근을 예방해라
9. 언어에 특정적인 쟁점
9.1. C/C++
9.2.
9.3. 파이썬
9.4. 쉘 스크립팅 언어 (sh 과 csh Deritivatives)
9.5. Ada
9.6. 자바
9.7. TCL
9.8. PHP
10. 특별 주제
10.1. 패스워드
10.2. 웹에서 인증
10.2.1. 웹에서 인증: 로그인
10.2.2. 웹에서 인증: 일련의 행동
10.2.3. 웹에서 인증: 로그아웃
10.3. 난수
10.4. 사용자가 기억하는 비밀 (패스워드 및 키) 을 특히 보호해라
10.5. 암호화 알고리듬 및 프로토콜
10.5.1. 암호학적 프로토콜
10.5.2. 대칭키 암호화 알고리듬
10.5.3. 공개키 알고리듬
10.5.4. 암호학적 해시 알고리듬
10.5.5. 무결성 검사
10.5.6. 다른 암호학적 쟁점
10.6. PAM 사용
10.7. 도구
10.8. Windows CE
10.9. 감사 레코드 작성
10.10. 기타
11. 결론
12. 문헌 목록
A. 책 발표 기록
B. 감사의 글
C. 문서의 라이센스
D. GNU Free Documentation License
E. 승인
F. 저자
표 목록
4-1. 합법적인 UTF-8 시퀀스
그림 목록
1-1. Abstract View of a Program