Category Archives: 보안

samsung 970 evo 에 TCG OPAL로 HW Encryption 적용하기

보통 파일이나 드라이브를 암호화 하기위해서는 소프트웨어에서 암호화를 진행하거나 CPU의 힘을 빌려 암호화를 진행한다.
이경우 암복호화 작업에 CPU연산이 소모되며 키관리도 OS에서 하다보니 여러가지 문제점이 생긴다.
SED(self-encrypting drives)의 경우 디바이스 자체적으로 암복호화하여 스토리지에 저장하는 방식을 지원한다.
당연 CPU연산이 불필요한 만큼 속도와 보안적인 측면에서 이점이 있다.

최근 구매한 970 EVO는 Class 0, TCG OPAL, Encrypted Drive  세가지 하드웨어 암호 옵션을 제공한다.
Class 0은 BIOS의 지원하에 부팅과정에서 암호를 입력하면 드라이브가 잠기거나 풀린다.
TCG OPAL과 Encrypted Drive의 경우 부팅 이후 특정 명령어를 컨트롤러로 보내 드라이브를 잠그거나 해제할 수 있다.

가장 간단한건 BIOS에서 지원하는 Class 0 방법을 사용하는것이다.
하지만 최근 구매한 Lenovo E585의 경우 영문자 + 숫자 조합만 가능하며 특수문자는 지원하지 않는 문제가 있다.
패스워드에 특수문자가 들어가지 않는다면 패스워드 크랙에 소요되는 시간을 크게 줄일 수 있고 그만큼 보안에 취약해진다.
따라서 현재 BIOS 상태에서는 Class 0는 선호하는 방법이 될 수 없다.
Encrypted Drive는 윈도우를 사용하는경우 여기에서 활성화 방법을 다루고 있다. (Microsoft eDrive 와 같은건가?)
이글에서는 TCG OPAL을 사용하여 SED를 활성화 하는 방법을 설명하고자 한다.

TCG OPAL을 설정하기 이전 간단한 구조부터 알고가면 이해가 쉬워진다.
OPAL이 활성화 된 Drive는 다음과 같은 동작을 한다.
처음 전원 투입으로 PC가 부팅하면서 Drive를 액세스 하면 Drive는 지정된 이미지(PBA:Pre-boot authrization)를 보여준다.
PBA는 부팅 가능한 작은 리눅스 이미지 이며 부팅과 함께 패스워드를 입력받아 이 패스워드를 Drive로 전달하는 역할을 한다.
Drive에서는 입력된 패스워드가 일치하면 Drive를 Unlock하게되며 이때부터는 암호화된 데이터를 읽고 쓸 수 있게된다.
PBA가 보여지는동안 즉, 패스워드가 입력이 안된 경우(실패한경우) 다른 매체를 통해 부팅하게되면 이 드라이브는 사용할 수 없다.

PBA가 보여지는동안 리눅스에서 Gparted로 확인하면
이렇게 보이지만 unallocated 영역을 파티셔닝하게되면
이런 에러가 뜨게된다.
윈도우에서 해당영역에 접근하면 이렇게 뜨게된다.
한마디로 읽지도 쓰지도 못한다.

서론이 길었지만 본론으로 돌아가서 TCG OPAL을 활성화 하는 방법은 libata.allow_tpm를 활성화 하여 sedutil을 사용하는 방법과 부팅가능한 USB에 rescue system을 구워서 그걸로 부팅해서 sedutil을 사용하는 방법이 있다.
본인의 경우 현재 시스템에 아무런 OS가 없어 Bootable USB를 사용하여 진행하였다.

USB를 통해 부팅하는경우 다음과 같은 로그인 화면이 나타난다.
나타난대로 login id는 root이며 패스워드는 없다.
사용가능한 Drive를 확인하기 위해 “sedutil-cli –scan” 명령을 입력하면 다음과 같은 결과가 나타난다.
이때 /dev/nvme0 뒤에 나타나는 숫자 2는 TCG OPAL 2.0을 지원한다는 의미이다.
이후 명령부터는 Drive를 초기화 할 수 있으니 데이터는 반드시 백업하여야 한다.
“linuxpba”명령은 앞서 말한 패스워드를 입력받아 Drive를 활성화 하는 명령이다.
패스워드로 “debug”를 입력하면 현재 설정만 보여주고 재부팅 하지 않는다.(다른거 입력하면 재부팅한다;)
현재는 설정이 아무것도 되어있지 않다.
“linuxpba” 명령을 통해 Drive가 보이며 해당 드라이브가 “is OPAL NOT LOCKED” 상태이면 잠글 수 있는 상태이다.
(본인의경우 linuxpba명령을 썼을때 디버그 메시지가 출력되어  less 나 more 명령어로 stdout만 따로 보았다)
예제에서 패스워드는 debug로 설정한 뒤 마지막 단계에서 원하는 패스워드로 바꾸게 된다.
진짜 이후 명령어부터는 기존 데이터가 어떻게 될지 모르니까 반드시 백업하고 진행하여야 한다.
Drive 잠금을 설정하기 위해 다음의 명령어를 입력한다.
sedutil-cli –initialsetup debug /dev/nvme0 # 초기화
sedutil-cli –enablelockingrange 0 debug /dev/nvme0 # 락0활성화
sedutil-cli –setlockingrange 0 lk debug /dev/nvme0 # 락0 크기 설정
sedutil-cli –setmbrdone off debug /dev/nvme0 # MBR done 설정, pba image 설정하기위한 명령어인듯
gunzip /usr/sedutil/UEFI64-n.nn.img.gz # 압축해제
sedutil-cli –loadpbaimage debug /usr/sedutil/UEFI64-n.nn.img /dev/nvme0 #pba image설정
n.nn은 해당하는 rescue 이미지의 버전마다 달라진다. 본인의 경우 UEFI64-1.5.1.img를 사용하였다.
순서대로 차례대로 입력하면 다음과 같은 결과가 나타난다.
여기까지 했다면 “linuxpba” 명령을 내리면 대상 Drive는 “is OPAL Unlocked” 상태로 표시되게 된다.
“not locked”와 “unlocked” 모두 한글로 보면 잠겨있지 않음이지만, not locked의 경우 잠금이 설정이 되지않은 상태, unlocked는 잠금이 설정되었지만 풀려있는 상태로 “is OPAL Unlocked” 상태가 되면 잠금이 설정되어 있는상태이다.
설정된 패스워드는 debug 이며 패스워드 변경을 위해 다음의 명령어를 입력한다. 이때 yourrealpassword의 경우 실제 적용될 패스워드로 변경하면 된다. (쉘에 직접 입력하는 방식이다보니 백슬러시를 통한 문자열 이스케이프가 필요하다)
sedutil-cli –setsidpassword debug yourrealpassword /dev/nvme0
sedutil-cli –setadmin1pwd debug yourrealpassword /dev/nvme0
패스워드 변경명령은 아무것도 출력되지 않는다. (성공메시지 조차도….)
패스워드 변경이 정상적으로 되었는지 확인하기위해 다음의 명령어를 실행하면
sedutil-cli –setmbrdone on yourrealpassword /dev/nvme0
변경된 패스워드가 맞을경우 MBRDone set on 이라고 뜨게 된다. (틀릴경우 method status code NOT_AUTHORIZED)
확인까지 끝났으면  전원을 “완전히” 껐다가 설정된 Drive로 부팅하게되면  PBA가 뜨게 된다.
설정한 패스워드를 정확히 입력하면 “is OPAL Unlocked” 가 뜨며 자동적으로 재부팅하게된다 (여기서도 debug를 입력하면 쉘로 빠지며 sedutil을 사용할 수 있다)
재부팅할때 BIOS에서 다른 부팅매체를 선택해 Windows 나 Linux 등의 OS를 설치할 수 있다.
아래는 샘숭의 매지션 소프트웨어에서 확인결과.

TCG OPAL 단점
부팅을 두번한다. (느리다 빠른부팅이 되지않는다.)
설정이 생각보다 간단하지 않다.(Class 0만큼 쉽지않아..)
절전모드(S3)에 들어가면 깨어나질 못한다. (드라이브 전원차단 = 인증해제, 다시 인증할 방법이 커널에 구현되어 있지 않음 sedutil에 –prepareForS3Sleep 과 같은 명령어를 쓰면 된다고하나 난 아직 잘안됨… 해결방법 아시면 피드백 부탁드립니다)
설정은 했는데 오버프로비저닝이 잘 적용 되는지 모르겠다.

ps. 패스워드 까먹으면 어떻게해야할지 모른다. (초기화로 되려나? 서비스센터 가져가야되나? 이미 OS 설치해버려서 테스트하기 귀찮…)
몇일전 Self-encrypting deception: weaknesses in the encryption of solid state drives (SSDs)  이런 논문이 나왔다.
라고한다.

참고문헌
https://wiki.archlinux.org/index.php/Self-Encrypting_Drives
https://github.com/Drive-Trust-Alliance/sedutil/wiki/Encrypting-your-drive

 

 

++++ 20181206 +++ 추가 +++

디스크 매니저에서는 잘 보이나

매지션 소프트웨어에서는 안보임…
시간날때 삼성에 문의해봐야지

비밀번호를 생년월일로 사용한 보안메일

몇일전 나의 메일주소로 X통신사의 이메일 청구서가 날라왔다.
내용은 보안메일이라고 사용자의 생년월일을 입력하라고 요구하였다.
수신한 메일은 나의 청구서가 아니며 비밀번호에 해당하는 생년월일도 모르는 상황이다.
잠깐 생각해보니 사람이 100년 산다고 생각하고 1년은 365일이라는걸 가정했을때 간단하게 36500의 경우의 수를 얻을 수 있었다.
또한 미성년의 경우는 제외하고 가장 가까운 날짜부터 차례로 계산한다고 하면 3만이 되지않는 경우의 수가 나온다.
직접 손으로 입력하기에는 많은데 JavaScript를 이용하여 패스워드에 해당하는 문자열을 생성하고 이를 Decrypt에 직접 대입하며 성공할때까지 수행하도록 만들 수 있다.

생각보다 빠르진 않았지만 결과는 스크립트를 실행한지 30분이 되지않아 출력되었다.

획득한 비밀번호를 이용하여 보안(?) 메일을 열어볼 수 있었다.

VVIP고객님께서 갤럭시 J5로 바꾸면서 이메일 주소를 잘못입력한것으로 확인된다.
(수신거부가 없다..)

생년월일은 절대로 비밀번호로 사용하지 않도록 해야 한다.
(근데 내가 받아보는 카드 청구서도 비밀번호는 생년월일이었다…..)

인터넷 뱅킹 계좌이체의 모순점

요즘 보이스 피싱이니  파밍이니 해서 은행 계좌이체가 굉장히 불편해졌다.
인터넷 뱅킹으로 단돈 만원 이체하는데 필요한것은

– 공인인증서, 본인명의 휴대폰(필수), 보안카드,
– 계좌 비밀번호(4자리), 자금이체 비밀번호(6자리 이상), 공인인증서 (비밀번호8자리 이상)

반면 모바일 앱 카드로 29만원 결제하는데 필요한것은

– 비밀번호(6자리 숫자)

추가로 공인인증서 + 공인인증서 비밀번호만 있으면 카드 한도닿는데까지 결제가 가능하다.

또 인터넷 뱅킹으로 100만원 이상 계좌이체시 상대방 계좌번호를 마우스로 입력하라고 한다.
고객센터 전화해서 왜이렇게 불편하나고 물어보니

직원 : “고객님은 전자금융사기예방 서비스 미가입자로써 100만원이상 이체시 마우스로 입력하셔야합니다”
나 : “저기요… 미가입이면 기존처럼 이용해야되는거 아닌가요? ”

상대방 계좌번호를 마우스로 찍는다고 보안이 얼마나 좋아지는가에 대해서는 잘 모르겠지만
내꺼 해킹할수 있으면 해도 좋으니까 좀 편하게 쓰게 해줬으면 하는 바램이다.

인터넷뱅킹, 이렇게 불편하게 하는것이 정말 사용자들이 원하는 방향일까?

warning.or.kr

스크린샷 - 2015년 06월 19일 - 20시 45분 37초우연찮게많이 만나는 페이지인 www.warning.or.kr의 메커니즘을 분석해보고자 한다.
본 페이지에서는 적당한 타겟으로 4shared.com을 예로 들었다.
크롬으로 http://www.4shared.com 요청시
1

NC로 HTTP GET 메소드 결과
2바로 warning.or.kr로 리다이렉트 되는것을 볼 수 있었다.
보다시피 DNS의 질의로는 필터링하지 않았다.
3따라서 패킷이 본서버로 가는중  필터링당한후 302가 날라오는것을 추측할 수 있다.
어떤 기준으로 필터링 되는지 알아보기위해 서버에 직접 접속한후 HOST 값만 localhost로 바꿨을때의 결과는 아래와 같다.
4정상적으로 결과값을 가져오는것을 확인할 수 있다.
그럼 패킷이 라우팅되는동안 HOST 필드를 확인하면서 블랙리스트를 만나면 실제 서버와 연결대신에 302를 날린다는것을 짐작할 수 있다.
어느 라우터에서 필터링이 걸리는지 확인하기위해 traceroute 를 실행하였다.
5이를 바탕으로 국가 경계점을 기점으로 HOST 필터링 여부를 확인하려 했으나 실패 ㄱ-

naver.com 에 HOST: www.4shared.com 시전시
6네이버 반환
www.google.com 에 HOST: www.4shared.com 시전시
7워링 반환

결론
ISP단에서 해외로 나가는 패킷에대해서 HOST 부분에 Inspection을 하는것을 알 수 있다.

우회방법
가장 좋은 우회방법은 SSL 사용이다.
https를 지원하지 않는 서버에는 HOST : localhost 나 가상 호스트 설정이 되어있는 서버로는
HOST : http://hostname 을 사용하면 우회가 가능하다. (여기까지 필터링은 하지 않는것으로 보인다)

NFC로 관리되는 도서 대여시스템 취약점

EAS(Electronic article surveillance)란 도난방지 장치 및 감지장치를 의미함.
http://en.wikipedia.org/wiki/Electronic_article_surveillance

많은 공공 도서관과 대학도서관에서 EAS를 위해 RFID를 사용중임
http://nicom.ibx.kr/bbs/board.php?bo_table=portfolio_x

호기심에 안드로이드의 TagInfo 어플로 해당태그를 스캔했더니
도서정보를 확인할 수 있었음.
taginfo

이 RFID 들은 NXP Icode SLI SL2 ICS20 제품이 사용됨.
http://www.nxp.com/documents/data_sheet/SL058030.pdf

데이터시트를 보니 EAS 라는 항목이 존재하고 이를 Set과 Reset 을 시킬수있는 프로토콜이 존재함.  (데이터시트 17p)
또한 이 플래그를 제어는 아무나 가능함.

간단한 안드로이드 어플리캐이션을 제작하여 테스트해봄
read unset
정상적으로 빌려온 도서이기에 EAS는 해제되어있음 (게이트 통과시 경보x)

이 도서에 Set 버튼을 통해 EAS 를 세팅
EAS Wirte
그후 태그 스캔시
read set
EAS가 세팅되어있음.

실제 화정 글샘도서관에서 실무자에게 양해를 구한뒤 실제환경에서 테스트를 모두 마치고 해당 내용 전달함. (14/03/04 11시경)

테스트한 태그는 모두 나인콤과 이씨오에서 정부에 조달한 제품으로 모두 간단히 본 어플에 태그함으로써 EAS비트를 조작할 수 있었음.
http://www.eco.co.kr/
http://nicom.ibx.kr/

NFC 지원 안드로이드폰은 현재 널리 보급되어있어서 EAS를 조작하는 어플리캐이션이 공개될 경우 도서관 뿐만 아니라 해당 태그를 사용하여 도난 방지하는 곳은 모두 무력하게 되므로써 이 시스템을 믿고 있었다간 큰 피해를 입을 가능성이 있음.

또한 회원카드 역시 동일한 태그를 사용하며 ISO/IEC 15693 (NfcV) 에 정의된 프로토콜을 사용함으로써 태그의 내용을 읽고 수정할 수 있으며 회원번호를 변조하여 타인명의로 대출할 수 있음.

해결방안 : 문제 발생전 태그 전량교체 외 해결방법이 없는 것으로 사려됨

 

ps. 도서관협의회에서 기 발표된 자료임.
http://www.kapul.or.kr/apload/userfiles/files/2014%20%EB%8B%A8%EA%B5%AD%EB%8C%80/%EC%A0%9C16%EC%B0%A8%20%EB%8F%84%EC%84%9C%EA%B4%80%EC%9E%A5%20%ED%9A%8C%EC%9D%98/ECO%20%EB%B0%9C%ED%91%9C%EC%9E%90%EB%A3%8C.pptx