일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- error
- ida
- Python
- Ransomware
- mock.patch
- h5py.File
- idapro
- data distribution
- malware
- idb2pat
- error fix
- 포인터 매핑
- hex-rays
- Rat
- ida pro
- commandline
- debugging
- open office xml
- ecma
- TensorFlow
- svn update
- Injection
- MySQL
- Analysis
- javascript
- NumPy Unicode Error
- x64
- pytest
- idapython
- why error
- Today
- Total
13 Security Lab
Windows 디지털서명의 구조와 원리 본문
1. 디지털 서명(Digital Signature)
디지털서명은 배포 되는 파일에 대한 Validation 과 Verification 을 위해 사용된다.
간단히 말하면, 누군가의 공개키가 그사람것이 맞다는 것을 보장해주는 것이다.
예를들어 A가 공개키를 배포했을때 이게 정말 A의 공개키인지 믿을수있게 신뢰할만한 기관 B가 자신의 비밀키로 A의 공개키를 전자서명한다.
그럼 B의 공개키를 믿을 수 있는 C는 A의 공인인증서를 B의 공개키로 풀어보면 거기서 A의 공개키가 나오게 되므로, 믿을 수 있는 기관 B가 신뢰하는 A의 공개키를 믿을 수 있게 된다.
그러면 B의 공개키는 어떻게 믿는가?
이에 대해 상위 레벨의 신뢰가능한 기관이 재귀적으로 존재, 즉, B의 공개키는 더 믿음직 스러운 기관 D가 비밀키로 전자서명해주는 식이 된다.
이런식으로 재귀적으로 올라가면 마지막에 루트 신뢰기관이 나오는데, 이것은 전세계적으로 하드코딩되어 확실히 믿을 수 있는 공개키라서 의심의 여지가 없다.
즉, 트리구조로 신뢰를 해주게 되어있다.
디지털 서명과 검증 프로세스
일반적인 디지털 서명은 RSA 알고리즘을 이용한다. 모두에게 신뢰 받는 기관에서는 요청자의 문서의 hash 값을 구하고 RSA 개인키로 암호화한다. 그리고 암호화한 값(서명)을 해당 문서 뒤에 첨부한다. 이 문서를 받은 사람은 서명한 기관의 공개키로 서명을 복호화한다(여기서 모두가 신뢰 받는 기관의 공개키는 알고 있다). 그리고 서명을 제외한 나머지 부분을 같은 hash 함수로 hash 값을 구하고 복호화한 서명과 비교한다. 일치한다면 해당 문서는 위변조가 없고, 신뢰 받은 기관에서 서명 받은 문서라고 판단할 수 있다.
Chain of Trust
모든 도메인을 한 두 곳의 신뢰받는 기관에서 인증해주면 좋겠지만, 현실적인 한계가 있다. 그래서 client가 알고 있는 수많은 신뢰받는 기관이 있고 이 기관을 대행할 중간 인증 기관들이 있다. 이 중간 인증 기관은 신뢰받고 있는 기관(Root CA)로 부터 인증서를 발급 받고, 중간 인증 기관은 그 하위의 중간 인증 기관을 인증해주는 과정을 거쳐서 최종적으로 내 사이트를 인증해 주는 chain 형태로 인증방식을 갖는다. 이를 그림으로 표현하면 아래와 같다.
Root CA는 각 국가, OS, 브라우저에 따라서 정책이 다양하다. 이는 클라이언트가 갖고 있는 인증서이기에 변화가 어렵다. 그러나 chain형식으로 관리하면 SSL 인증서 발급의 유연성을 확보할 수 있다. 위 그림에서 보면 self-sign이란 표현이 있다. Root CA의 인증서는 self-sign하는데, 상위의 CA가 없으므로 자신의 개인키를 갖고 자신의 인증서를 디지털 서명해둔다. 이 서명은 Root CA의 공개키를 사용해서 인증서의 신뢰성을 판단한다.
2. 디지털 서명과 공인인증서의 구분
공인인증서의 정의
공인인증서(公認認證書) 는 전자 서명의 검증에 필요한 공개 키(전자서명법에는 전자서명검증정보로 표기)에 소유자 정보를 추가하여 만든 일종의 전자 신분증(증명서)이다 (https://ko.wikipedia.org/wiki/공인인증서)
위와 같이, 공인인증서는 한국에서만 정의되는 것으로 파일에 대한 전자서명(공개키기반의)을 파일형태(NPKI)로 관리하여 전자 신분증 형태로 관리하는 것이다.
"Digital Signature", "Electronic Signature"라는 단어도 의미상으로 "공인 인증서" 라는 의미를 담고 있다. 또한, 국내용어 "전자서명"과 "공인인증서"도 서로 혼용되고 있다.
다만, 인지해야 할 부분은 우리가 알고있는 금융 거래 등 신분 인증을 위한 "공인인증서"는 한국 내에서 독자적으로 개발 된 국내에서만 사용되는 "국내표준"으로서 사람에 대한 인증이며
"전자서명"(또는 "디지털 서명")은 국제 표준으로서 파일에 대한 인증을 그 목적으로 한다.
3. 디지털 서명간의 구분
위 전자 서명에 대한 글(http://d2.naver.com/helloworld/744920)을 읽어보면 "발급대상", "서명자 이름" 또한 아무나 변경할 수 없어 아래와 같이 "이 디지털 서명은 유효합니다." 라는 서명정보를 확인한다면 우선 믿을 수 있는 것으로 판단된다.
여기서 궁금한 것이, 발행 주체가 누군지는 알겠는데 서로 다른 파일을 인증한 것에 대해서 같은 인증서인지 유무를 어떻게 판단 할 수 있을까 하는 점이다.
전제사항
- 상위 인증서 발급주체(CA)가 제공한 인증 툴이 있을 것이다.
- 전자서명은 인증 고유번호를 가지고 있을 것이다. (왜냐하면 상황에 따라 인증그룹 별로 신규발급과 해지를 진행해야하므로..)
- 발급자의 인증 고유번호는 하나가 아닌 상황에 따라 여러개로 관리 될 것이다.
아래 카카오톡의 두개 파일에 대한 예를 통해 살펴보려고 한다.
아래를 보면 두개의 파일에 대한 서명자("Kakao Corp.")는 같지만, 서명시간은 다른 것을 알 수 있다.
이때, 이 두 인증서는 다른 것일까?
아래와 같이 "일련 번호", "지문"이 일치함을 알 수 있다.
위에서 언급하지 않았지만, 인증서 "자세히" 속성에서 나타난 모든 정보가 일치 했다.
따라서 이 인증서의 정보는 파일에 대한 정보가 아닌 인증서 자체에 대한 정보를 나타내는 것으로 보인다.
달라지는 경우와 비교 (카카오톡 같은 폴더 내 "uninstall.exe" 파일)
서명자 정보의 이름부터가 다르지만.. 진행해보도록 한다.
어쩌면 당연한 것이지만, "일련번호", "지문" 등 모든 정보가 불일치 하였다.. 이부분은 좀더 명확히 할 필요가 있는 것으로 판단된다.
다만, 같은 전자서명 발급 주체의 서로다른 인증서 서명을 구분함에 있어 일련번호("Serial Number")로 구분하면 될 것으로 판단된다.
4."연대 서명"(countersignature)이 가지는 의미
연대서명에 대해 간단히 언급한다.
연대 서명은 다른 디지털 서명의 디지털 서명입니다. 따라서 이 기능은 메시지의 내용이 아닌 서명의 인증만 제공합니다. 디지털 서명은 여러 명의 연대 서명자에 의해 연대 서명될 수 있습니다.
(https://msdn.microsoft.com/ko-kr/library/ms180950(v=vs.90).aspx)
5. 인증서가 유효하지 않은 경우
위와 같이 나타나는 이유는 다음과 같다.
- 서명한 이후에 콘텐츠를 변경한 것과 같이 몇 가지 이유로 인해 디지털 서명이 잘못된 경우
- 디지털 서명이 만료된 경우
- 디지털 서명에 연결 된 인증서 인증 기관 (CA)에서 발급 되지 않습니다. 예를 들어 Selfcert.exe를 사용 하 여 만든 자체 서명 된 인증서를 수 있습니다.
- 게시자를 신뢰할 수 없는 경우
(https://support.office.com/ko-kr/article/디지털-서명이-신뢰할-수-있는-것인지-구별하는-방법-0464f8ab-fefa-4bc7-af0d-e07a12f7097e)
+ 공인인증서 관련 python 오픈소스 코드
https://github.com/bandoche/PyPinkSign
6. 인증서 검증
6.1 Command: chktrust "file name"
명령어 "chktrust" 를 통해서 서명된 파일에 인증서가 제대로 된 인증서인지 도구를 통해 검증할 수 있다.
6.2 WinVerifyTrust API 사용
다른 한편으로는 API 를 사용하여 파일의 서명 인증서를 검증할 수 있는 방법이 있다.
Example C Program: Verifying the Signature of a PE File
참고하기
네이버 애플리케이션의 전자 서명 원리
http://d2.naver.com/helloworld/744920