Programming2011.03.15 18:12



Part 1 현대에 있어서 보안

Chapter 1 보안상 안전한 시스템의 필요성
World Wide Web에서의 애플리케이션
Trustworthy Computing의 필요성
모든 사람의 관심을 집중시키는 방법
기업내에 효과적으로 보안의 가치를 설득하는 방법
실제 공격을 보여줌으로써 기업조직에 보안의 가치를 설득하는 방법
보안을 기업문화로 정립시키기 위한 몇가지 아이디어
최고 경영자가 메일을 보낸다
보안 담당자를 지정한다
공격자의 우위 및 방어자의 딜레마
원칙 #1: 방어자는 모든 위치를 방어해야 한다; 공격자는 가장 약한 위치를 선택할 수 있다.
원칙 #2: 방어자는 이미 알려진 취약성에 대해서만 방어할 수 있다; 공격자는 알려지지 않은 취약성을 나중에 찾을 수 있다.
원칙 #3: 방어자는 항상 경계해야한다; 공격자는 아무 때나 공격할 수 있다.
원칙 #4: 방어자는 규칙에 따라 경기를 한다; 공격자는 반칙을 할 수 있다.

Chapter 2 보안 예방을 위한 개발과정
개발과정의 개선
교육의 역할
의무적 교육에 대한 저항
지속적인 교육
보안을 과학적으로 발전시키기
더 많은 사람이 더 많은 문제점을 찾을 수 있다는 허구
그 증거!
설계 단계
인터뷰시에 보안에 관한 질문
제품의 보안 목표를 정의하라
보안도 제품 기능이다
보안을 위한 시간을 할당하기
위협 모델을 통해 안전한 설계가 가능하다
안전하지 못한 기능은 단종 계획(end-of-life plan)을 만든다
고쳐야 할 버그의 기준을 설정하기
보안 팀의 검토
개발 단계
새로운 코드를 추가할 수 있는 사람에 대해 철저히 관리한다
신규 코드의 보안에 관한 피어 리뷰(peer review)
안전한 코딩에 대한 가이드라인을 정의하라
이전의 결함을 검토하라
외부 기관을 이용한 보안 검토
Security Push
버그 수를 적정선으로 유지하라
버그에 대한 측정기준을 유지하라
이스터 에그를 만들어 사람을 놀라게 하지 말라
테스트 단계
출시 및 유지보수 단계
완료를 어떻게 알 수 있는가?
대응 절차
책임

Chapter 3 항상 같이 해야 할 보안의 원칙
SD3: 보안을 고려한 설계, 기본설정 그리고 운용
보안을 고려한 설계(Secure by Design)
보안을 고려한 기본 설정(Secure by Default)
보안을 고려한 운용(Secure by Deployment)
보안의 원칙
실수에서 배운다
공격가능 영역을 최소화한다
기본 설정은 보안을 고려하여 정한다
다단계 방어를 한다
최소한의 권한을 사용한다
이전 버전과 호환성 문제는 항상 어려움이 수반됨을 명심한다
외부 시스템은 보안상 안전하지 않다고 가정한다
장애시 대책을 세운다
장애시 안전한 모드로 전환한다
안전한 기능과 보안 기능은 별개라는 것을 명심한다
보안을 비공개에만 의존하지 않는다
코드와 데이터를 분리한다
보안 문제는 올바르게 고친다

Chapter 4 위협 모델링
위협 모델에 의한 안전한 설계
위협 모델링을 수행할 팀을 소집한다
애플리케이션을 분해한다
시스템에 대한 위협을 결정한다
결정된 위협에 우선순위를 정한다
위협에 대응하는 4가지 방법 중 하나를 선택한다
위협에 대응할 기법(technique)을 선택한다
보안 기법
인증
권한 부여(Authorization)
변조 방지 및 기밀성 향상을 위한 기술
기밀정보를 보호하거나, 기밀정보는 아예 저장하지 말라
암호화, 해시, MACs 그리고 전자서명
감사
필터링, 조절(throttling) 그리고 서비스 품질(Quality of Service)
최소 권한
급여 애플리케이션 예제의 위협을 예방하기
다양한 위협과 대응


Part 2 안전한 코딩 기법
Chapter 5 공공의 적, 1위: 버퍼 오버런
스택 오버런
힙(Heap) 오버런
배열 첨자 오류
포맷 문자열 버그
유니코드와 ANSI 버퍼 불일치
유니코드 버그의 실제 예
버퍼 오버런 예방법
안전한 문자열 처리 방법
문자열 처리 함수 사용 시 주의점
Visual C++ .NET의 /GS 옵션

Chapter 6 적절한 사용 권한 결정
ACL이 중요한 이유는?
레지스트리 코드 수정본 
ACL의 구성
적절한 ACL을 선택하는 방법
효과적인 거부 ACE
ACL 생성
Windows NT 4에서 ACL 생성
Windows 2000에서 ACL 생성
ATL(액티브 템플릿 라이브러리)을 이용한 ACL 생성
ACE 권한 지정의 순서
터미널 서버와 원격 데스크톱 SID의 주의할 점
널(NULL) DACL과 그 밖의 위험한 ACE
NULL DACL과 감사(audit)
그 밖의 위험한 ACE
NULL DACL을 변경할 수 없다면?
운영 체제에 포함되지 않는 기타 접근 권한 메커니즘
.NET 프레임워크 역할
COM+ 역할
IP 제한
SQL 서버의 트리거와 SQL 서버의 사용 권한
의료 애플리케이션 예제
접근 권한 메커니즘의 중요 사항

Chapter 7 최소 권한으로 실행
현실 세계에서 최소 권한
바이러스와 트로이 목마
웹 서버 손상
사용 권한 제어의 개요 
권한의 개요
SeBackupPrivilege의 문제
SeRestorePrivilege 문제
SeDebugPrivilege 문제
SeTcbPrivilege 문제
SeAssignPrimaryTokenPrivilege와 SeIncreaseQuotaPrivilege 문제
SeLoadDriverPrivilege 문제
SeRemoteShutdownPrivilege 문제
SeTakeOwnershipProvilege 문제
토큰의 개요
토큰, 권한, SID, ACL과 프로세스 간의 연관성
SID와 사용 권한 검사, 권한과 권한 검사
애플리케이션이 상승된 권한을 필요로 하는 세 가지 이유
ACL 문제
권한 문제
LSA 기밀 데이터 사용
상승된 권한 문제의 해결책
ACL 문제 해결하기
권한 문제 해결하기
LSA 문제 해결하기
적절한 권한 결정 과정
단계 1: 애플리케이션에서 사용되는 모든 리소스 찾기
단계 2: 애플리케이션에서 호출하는 모든 권한이 필요한 API를 찾기
단계 3: 어떤 계정이 필요한가?
단계 4: 토큰의 내용(SID와 권한) 읽어 오기
단계 5: 모든 SID와 권한이 필요한가?
단계 6: 토큰 조정
Windows XP와 Windows Server 2003에서 낮은 권한의 서비스 계정
가장(impersonate) 권한과 Windows Server 2003
최소 권한 디버그 문제
애플리케이션이 일반 사용자 모드에서 실패한 이유
애플리케이션이 실패하는 문제 분석 방법

Chapter 8 암호화(Cryptography)의 약점
난수(random number) 사용의 문제
rand 함수의 문제점
Win32에서 암호화된 난수
관리되는 코드에서 암호화된 난수 생성
웹 페이지에서의 암호화된 난수
암호화 키(Cryptographic Key) 생성에 암호(Password) 사용
효율적인 암호(password)의 비트 크기
키 관리 문제
장-시간 키와 단-시간 키
데이터 보호에 적절한 키 길이 사용
키는 키를 사용하는 데이터 가까이에만 둔다
키 교환 문제
자신만의 암호화(cryptographic) 함수 생성
동일한 스트림-암호 암호화 키 이용
개발자들이 스트림 암호를 사용하는 이유는?
스트림 암호의 함정
만약 반드시 동일한 키를 사용해야 한다면?
스트림 암호(cipher)에 대한 비트-플립 공격
비트-플립 공격 해결책
언제 해시, 키-해시, 디지털 서명을 사용하는가?
원-텍스트와 암호화된 텍스트(ciphertext) 버퍼의 재사용
해커의 위협을 줄이기 위해 암호화 기술을 사용하라
사용하는 암호화 기술을 문서화한다

Chapter 9 기밀 데이터 보호
기밀 데이터 공격
기밀 데이터를 반드시 저장할 필요는 없다
난수(Salt)가 추가된 해시
공격자의 공격을 어렵게 하기 위한 PKCS #5 활용
사용자로부터 기밀 데이터 얻기
Windows 2000과 그 이후 버전 운영 체제에서 기밀 데이터 보호
Windows XP에서의 클라이언트 자격 증명
Windows NT 4에서의 기밀 데이터 보호
기밀 데이터 보호
PnP 디바이스에서 디바이스 정보 얻기
최소 공통 분모 솔루션은 선택하지 않는다
메모리에서 기밀 데이터 관리
컴파일러 최적화(Optimization) 주의점
메모리 상의 기밀 데이터 암호화
민감한 데이터의 페이징을 막기 위해 메모리 잠금 함수 이용
관리되는 코드에서 기밀 데이터 보호
관리되는 코드에서 메모리 내의 기밀 데이터 관리
보안 수준 올리기
FAT 파일 시스템상의 파일에 데이터 저장
데이터 암호화에 암호화 키와 XOR를 사용
데이터 암호화에 3DES 키를 사용
데이터 암호화에 3DES 키를 사용하고 레지스트리에 암호 저장
데이터 암호화에는 3DES를 사용하고, 레지스트리에 강력한 이름을 저장
사용자에게는 암호를 입력 받고, 파일과 레지스트리 키에는 보안(ACL)을 지정 
기밀 데이터 보안의 장/단점

Chapter 10 모든 입력 데이터는 위험하다!
어떤 문제들이 있는가?
잘못된 신뢰(Misplaced Trust)
입력 데이터 공격을 방어하는 전략
적법성 검증 방법
펄(Perl)에서 오류 검사(tainting check) 옵션
일반식(regular expression)을 이용한 입력 데이터 검사
일치하는지 검사 후에는 검증을!
일반식과 유니코드
일반식 로제타 스톤
펄에서의 일반식
관리되는 코드에서의 일반식
스크립트에서 일반식
C++에서의 일반식
일반식을 사용하는 좋은 사례

Chapter 11 정규 데이터 표현
'정규적인(Canonical)’은 무엇을 의미하고 왜 문제가 되는가?
정규 파일명 문제
넵스터의 이름 필터 통과 버그
애플 Mac OS X와 아파치의 취약점
DOS 디바이스 명 취약점
썬 마이크로시스템 스타오피스의 /tmp 디텍토리 심볼릭-링크 취약점
윈도우 정규 파일명 실수
웹에서의 정규화 문제
AOL의 컨테이너 통과 버그
eEye의 보안 검증 통과
보안 영역과 인터넷 익스플로러 4 “점이없는 IP 주소” 버그
인터넷 정보 서버 4.0의 ::$DATA 취약점
한 라인이 언제 실제로는 두 라인인가?
또 다른 웹 문제 - 이스케이프(Esc)
동형이의(Homograph) 공격
정규화 버그 예방
이름에 근거한 보안 결정 하지 않기
일반식을 이용하여 허용되는 이름으로 제한한다
8.3 파일명 생성은 하지 않는다
환경 변수 PATH를 신뢰하지 말고, 완전한 절대 패쓰명을 사용한다
파일명 정규화
안전한 CreateFile 함수 호출
웹에서의 정규화 문제 해결
적법한 입력으로만 제한
UTF-8 문자는 조심스럽게 사용한다
ISAPI 애플리케이션과 ISAPI 필터
파일 이외의 정규화 문제
서버명
사용자명

Chapter 12 데이터베이스 입력
잘못된 신뢰의 문제
의사(Pseudo) 해결책 #1: 사용자 입력을 따옴표로 처리
의사(Pseudo) 해결책 #2: 저장 프로시저 사용
해결안 #1: 절대로 sysadmin으로 데이터베이스 서버를 연결하지 않는다
해결안 #2: 안전한 SQL 문 빌드
안전한 SQL 저장 프로시저 빌드
다단계 방어 예제 코드

Chapter 13 웹에서의 입력
교차-사이트 스크립트: 잘못된 결과 출력
공격자에게
Posted by MyLifeStyle

티스토리 툴바