2012년 10월 2일 화요일

ATA 이야기4

아무도 기다리고 있지 않았던 ATA 이야기 4편입니다.
 신규 model 개발로, 정신없이 7월 초까지 개발에 매진하다가 겨우 정신을 차려보니 벌써 오늘이더군요.  Blog에 독후감을 쓰러 갔다가 반가운 댓글을 보고 난 후 귀차니즘을 극복하고 쓰고 있는 중입니다. '댓글은 나의 힘!'이라는 말을, 평소 의미있게 받아들이지 않았었는데, 오늘 달린 댓글이 힘을 불어넣어주네요~
 그럼 시작하겠습니다~
 휘비고~

 오늘 다룰 내용은 Security Mode Feature Set입니다.
 이 녀석은 저와 같은 firmware 개발자들은 정말 싫어하는 단순 노가다성 작업을 만들어 내지만, 사용자나 특정 기업들은 좋아하는 이율배반적인 녀석입니다. 특히나 IT 업계의 공룡 HP는 유독 이 feature set과 관련된 까다로운 요구사항이 많은데, HP 때문에 이걸 구현해야하나라는 생각이 들 때가 많이 있습니다. 물론 지금이야 아예 이 녀석과는 안녕을 해버렸지만, 예전에 test에서 불량이 발생하여 firmware 이곳저곳을 수정해야만 했었던 적이 있었는데, 정말 싫었었습니다. 다시는 쳐다보기도 싫었던 녀석인데, 이렇게 글을 쓰고 있다니 참 세상은 재미있는 것 같습니다.

 전체적인 내용을 요약하여 말하자면 아주 간단합니다. 암호를 설정하고 남이 못쓰게 잠궈버리는 기능이 전부입니다. 이렇게 잠긴 상태에서 이걸 풀어야 하는데 은행 ATM처럼 몇회 이상 암호 입력이 틀리면, 놀라지 마세요~! 사용자 data 영역 전체를 지워버리는 아주 무식한 기능까지 갖추고 있습니다.
 작년인가 Segate인가 Intel SSD에서 firmware 오류로 사용자 암호를 설정하면 data가 지워지는 문제가 있었는데, 십중팔구 firmware engineer가 요쪽 code에 bug를 심어놨을 가능성이 다분합니다.

 여기서 잠깐 간단한 HDD 상식에 관련된 이야기 하나 할까요? 위에서 말씀드린 지운다는 것은, HDD 입장에서는 의미없는 data pattern으로 해당 영역을 다시 써버린다 쯤 되겠습니다. 즉, HDD에서는 사전적인 의미의 지운다라는 동작은 없다라는 것입니다. 그럼 digital device에서 의미없는 pattern이란 무엇일까요? 뭐 간단하지 않겠습니까? '0x0000' 이거나 '0xFFFF' 등이겠죠. 이 pattern은 제조사 마음대로인 것 같습니다.
 다시 본론으로 돌아와서, Security Mode Feature Set을 이해하기에 앞서 왜 Security가 아닌 Security Mode인지를 생각해보시면 더 쉽게 이해하실 수 있을 겁니다. 왜 굳이 mode라는 단어까지 사용했냐면, 암호 설정 관련된 부분과 암호 설정 여부에 따라 기타 다른 command가 들어왔을 때에 어떻게 처리할지를 관리하기 위한 부분, 이렇게 크게 두 가지로 나누어져있는데, 전자가 Security에 해당하고 후자가 Mode에 해당한다고 보시면 됩니다.
 그럼 하나씩 살펴볼까요?
 우선 암호는 우리가 흔히 BIOS에서 볼 수 있는 user password와 master password 두 가지 종류가 있습니다. Master는 제한적인 경우에 사용합니다. 예를 들어 user password를 잊어 먹었을 때, 잠겨있는 HDD의 상태를 풀어서 다시 변경할 때, 나 이 HDD의 쥔장이다라는 것을 인증하기 위한 것으로 전체적인 동작에 큰 영향을 미치지는 않습니다. 실제 Security와 가장 중요하게 관련된 녀석은 user password라고 보시면 됩니다.
 그리고 각 password를 설정할 때 두 가지 level로 설정할 수 있습니다. 그 두 가지는 high와 maximum level입니다. Master password야 high건 master건 별로 상관이 없지만, user password는 이 level 값에 조금 민감하게 반응합니다. High level로 user password를 설정해놓으면 이를 기억하지 못한다고 하여도 master password를 알고 있으면 잠금 상태를 풀 수 있습니다. 그런데 만약 maximum level로 잠궈 버린 상태에서 기억나지 않는다면 이건 답이 없습니다. Maximul level로 user password를 설정하면 master password를 안다고 하여도 해당 drive의 잠금 상태를 풀 수 없도록 spec.에 규정되어 있습니다. 위에서 잠깐 '제한적인 경우'를 언급했는데 그게 바로 이런 경우입니다. 지금 생각해보니 master라는 이름이 아깝네요.
 만약 이런 경우를 만난다면 울며 겨작먹기식으로 data가 모두 날아가는 것을 지켜보든지, 아니면 제조사에 들고 가서 요청을 해야지만 해결할 수 있습니다.

 그럼 Security Mode Feature Set의 양대 산맥인 mode에 대해서도 좀 알아볼까요? 암호를 설정하게 되면 device는 잠겨버리게 되어 있습니다. 이렇게 잠기게 되는 상황을 spec.에서는 좀 더 세분화시키고 있습니다. 일단 아무것도 손대지 않았을 경우를 security disabled라고 합니다. 이 상태에서 특정 command를 받게 되면 enabled 상태가 되고 command 종류의 따라 잠기는 상황이 되는데 이를 locked라고 합니다. 여기까지면 쉽겠는데 또 다른 특정 command를 받게 되면 disabled 상태에서 잠기는데 이를 frozen이라고 합니다. 요약하자면 Security Mode Feature Set에서는 disabled/enabled와 locked/unlocked. frozen/not frozen 등과 같은 mode의 조합을 이용하여 각각의 상황에 맞게 state machine을 제어하게 됩니다.
 사실 요약이 요약이 아닐 정도로 무슨 소린지 모르겠습니다. 밑에 state diagram을 붙여놓고 다시 설명드리겠습니다.


 우선 여기까지 대충 개념은 설명한 듯 하니, 이 녀석과 관련된 command들을 좀 알아보겠습니다.
  - SECURITY SET PASSWORD
  - SECURITY UNLOCK
  - SECURITY ERASE PREPARE
  - SECURITY ERASE UNIT
  - SECURITY FREEZE LOCK
  - SECURITY DISABLE PASSWORD

하나씩 살펴볼까요?
 SECURITY SET PASSWORD command는 user/master password를 설정하는데 사용합니다. 이 녀석은 data-out command로 반드시 512byte를 전송해줘야 합니다. 이 command에 딸려 나가는 data structure는 아래와 같습니다.
ATA spec.에서 오려왔습니다.
Word0는 제가 위에서 설명한 내용에 맞게 채워주면 됩니다. 그리고 실제 암호에 해당하는 녀석은 Word1 ~ 16까지의 32bytes로 여기에 구미에 맞게 채워주시면 됩니다.
Word17은 master passowrd를 설정할 때 채우는 값으로, 채울 때 주의 사항이 있는데 이 값이 만약 0h이거나 FFFFh이면 abort error가 나니 반드시 위 두 값이 아닌 다른 값을 채워줘야 한다는 것입니다.
 참~ 쉽죠잉~
뭐 위의 table의 각각의 항목만 이해하셨다면 일단 이 command는 거의 이해한거나 다름 없습니다. 그럼 거의를 빼고 난 나머지는 무엇일까요? 그건 밑에서 설명드리겠습니다.


 SECURITY UNLOCK command는 SET PASSWORD의 반대 개념이라고 생각하시면 됩니다. 이름에서 풍기는 느낌처럼 device가 locked 상태일 때 이를 풀어서 unlocked 상태로 돌릴 때 쓰는 녀석입니다. 이 녀석도 마찬가지로 data-out command인데 주의할 점이라면 SET PASSWORD로 설정한 암호와 동일한 값을 실어서 보내야지 안그러면 처음에 말씀드린 ATM 사고가 날 수도 있습니다.
 SECURITY ERASE PREPARE command는 좀 재미있는 녀석입니다. ATM 사고라고 제가 살짝 겁을 주기는 했지만 사실 비밀번호가 다 틀렸다고 해서 바로 data를 지우지는 않습니다. 지우기 위해서는 자 지워라'라는 command를 날려줘야 그 때부터 지우기 시작하는 것입니다. 이 녀석은 '자 지워라' command를 보내기 전 마지막 안전장치로 반드시 '자 지워라' command 이전에 보내야 합니다. 이 command 없이 '자 지워라' command를 보내면 device는 '님~ 뭐셈~? 즐~'이라는 반응을 보일 겁니다.
 죄송합니다. 나이를 먹더니 자꾸 썰렁해지기만 합니다.
 어찌됐건 이 녀석은 마지막 안전장치라는 것만 머리속에 집어넣으시면 될 것 같습니다.

 SECURITY ERASE UNIT command가 바로 위에서 언급한 '자 지워라'에 해당하는 녀석입니다. 그런데 이 녀석이 수행하는 역할 자체가 워낙 무시무시한 것이라, 이 command 자체도 안전장치를 가지고 있습니다. 그게 무엇일까요? 이 녀석 자체가 data-out command입니다. 즉, 기존에 설정된 user 또는 master password와 일치해야지만 실제적인 지우는 동작이 시작되는 것입니다. 사실 합리적으로 생각해보면 그렇지 않겠습니까? 만약 일부러 password를 틀리게 command를 보낸다음 이 command를 보내는 것만으로도 data를 지울 수 있었다면 분명 hacker의 먹이감이 되어 난리가 났었을 겁니다. Spec.은 괜히 spec이 아닌가 봅니다. 이 command로 실어 보내는 data structrure는 SET PASSWORD command와는 좀 다르게 생겼습니다.

다른 것이야 다 이해하시겠죠? 뭐 부연설명이 필요한 것이라면 erase mode가 있겠네요. Normal과 enhance의 차이는 무엇일까요? 업무상 기밀이라 요부분은 말씀드리기 애매한 부분인 것 같습니다. 어짜피 지워지는 것은 똑같으니 만약 test 해보고 싶으신 분들께서는 enhanced mode를 추천하고 싶습니다.


 SECURITY FREEZE LOCK command는 딱 보면 감이 오지 않겠습니까? 직역하자면 "Locked/unlocked인 상태로 꽁꽁 얼려버려 아서스!" 정도 될까요?
 아서스는 WOW 하시는 분이면 어느 정도 이해하실 수 있는 농담입니다...
 네... 저는 뉀네입니다...
 뉀네를 모르는 당신은 눼눼~ 우후훗~(지루할 것 같아 살짝...;;;)

 위에서 forzen mode에 대해서 살짝 언급했었는데요, 말그대로 어떤 mode 상태로 얼려버리는 것입니다. 현재 device가 locked/unlocked mode인 상태로 이 command 상태로 frozen mode까지 더해진다면, power를 껐다 키거나 또는 hard-reset이 아니고서는 lock mode 관련해서는 변경할 수 없습니다. 가령 device가 locked mode였는데 이 command를 받고 locked/frozen mode로 진입하면 power/hard-reset을 제외하고는 이 drive의 locked mode를 unlocked mode로 풀 수 없다는 것입니다. 복잡하시죠? 저도 왜 이따구로 만들었는지 담당자가 미울 뿐입니다. 그는 아무래도 철통 보안이라는 title을 따고 싶었나 봅니다.
 SECURITY DISABLE PASSWORD command는 disable이라는 단어가 핵심입니다. 간단하게 설명하자면 현재 설정된 locked mode를 풀고 disabled mode로 다시 돌아오게하는 녀석입니다. 이 녀석도 data-out command로 data structure는 아래 처럼 생겼습니다.
 이 녀석은 단순히 mode 변경만을 위한 것으로, command를 보낸다고 해서 기존의 command가 바뀌거나 하지는 않습니다.


 후아...
 어제부터 틈틈히 작성했는데 벌써 날을 넘겨버렸네요. 일하면서 test 걸어놓고 짜투리 시간에 작성하는 것이라, 문법도 엉망 내용도 엉망이네요. 이해해주시길 바라겠습니다.

 자 어느정도 이 feature set에 관한 개념이 잡히셨나요? 각각의 command와 password, mode에 대한 기초지식은 파악이 되셨으리라 믿고 이번 이야기의 꽃인 state diagram에 대해 살펴보도록 하겠습니다.
 정신 똑바로 차리시지 않으시면 limbo에서 빠져나오실 수 없습니다!(<- Inception은 정말 대박이었습니다.)
 자우선 아래 state diagram을 보시죠. 심호흡 한 번 하시구요~

 우선 시작점을 살펴볼까요? 시작점은 바로 SEC0입니다. 제조사에서 출하된 후 별도의 가공을 거치지 않았다면 무조건 시작점은 SEC0입니다. 예외가 있는데, 특정 회사의 BIOS에서는 요녀석의 상태를 바꾸기도 하는데 그게 어디였는지 기억이 안나는 군요. 만약 BIOS에서 mode를 변경해버렸다면 그 device는 그 system에 귀속되버립니다. 무시무시하죠.


 자...
 SEC0:Powered down/Security disabled 라는 것을 보니 딱 봐도 power가 꺼진 상태이고 이 때는 disabled 상태라는 것을 나타내는 거겠죠? Power on 후에는 무조건  SEC1 상태로 가고 여기서 만약 SECURITY SET PASSWORD command를 받게 되면 SEC5 상태로 가게 됩니다. 여기서 주의하실 것이 SEC5:Unlocked/Not forzen 이라는 문구입니다. SET PASSWORD command를 받았다고 해서 무조건 locked mode로 빠지는 것이 아니라, command를 받고 나서 reset 또는 FREEZE LOCK command를 받아야지만 실제적으로 잠김 상태인 SEC4로 가는 것입니다. SEC4로 가고 나서 별도의 security command 없이 power down이 되면 이후부터 시작점은 SEC3가 되게 되고, 이 때부터는 아무리 power를 껐다키고 reset을 날린다 하여도 SECURITY UNLOCK이나 ERASE UNIT command가 아니고서는 locked mode에서 빠져나올 수 없는 것이죠. 어제는 잠궈버리다는 표현이 적절한 줄 알았는데 오늘 보니 귀속이라는 표현이 딱인 것 같습니다.

 기타 다른 경우의 수도 설명이 필요하신가요?
 위에서 적은 내용을 어느 정도 이해하셨다면 이 state diagram은 가볍게 해석 및 적용하실 수 있으리라 믿겠습니다~!(귀찮아서가 절대 아닙니다....;;;)

 쓰다보니 한가지 빼먹었는데, device가 locked mode일 때는 몇몇 command를 abort시켜버립니다. ATA command 자체가 좀 많아서 간단하게 개념만 말씀드리자면 user data를 read/write 하는 command 계열은 모두 abort 시킨다고 보시면 됩니다. 꼭 그런 것만은 아니나 대충 그렇다는 것입니다. 이와 관련된 table이 있는데 이게 좀 길고 양이 많아서 붙이기가 애매하네요. 에잇! 그래도 혹시 필요하실 분이 있을지도 모르니 붙여드리겠습니다. ATA-7 기준입니다.

 
 아...
 시작할 때는 의욕이 충만했었는데, 시간이 흐를 수록 귀찮아지는군요. 다음 글은 좀 더 내실있고 성실하게 쓸 것을 다짐하며 이번 이야기는 여기서 마무리하도록 하겠습니다.

 다음 편은 SMART Feature Set입니다. 양이 정말 많은데 한 번에 쓸 수 있을지 모르겠습니다...;;;

댓글 없음:

댓글 쓰기