콜드카드 RNG 버그, 커밋 메시지 단 5글자 'runs' 뒤에 숨은 진짜 원인
- 콜드카드 펌웨어의 저엔트로피 취약점은 커밋 메시지가 단 5글자 "runs"인 커밋에서 시작됐고 이 커밋 하나가 1534줄을 바꿈
- 이 커밋은
MICROPY_HW_ENABLE_RNG (0)을 설정해 하드웨어 RNG를 끄고 자체 Yasmarang RNG를 쓰도록 만들었음 - libngu 저장소의 후속 커밋은 메시지가 단 한 글자 "x"였고 약 1000줄을 변경함
- HN 댓글(nullc로 추정)에 따르면 실제 원인은 마이크로파이썬 쪽 하드웨어 TRNG 코드가
#if로, 콜드카드 대체 구현이#ifndef로 게이트되어 있어 값 설정과 정의 여부 검사가 어긋난 것이며, 두 코드가 서로 다른 저장소에 나뉘어 있어 더 발견하기 어려웠음 - 트위터 보안 권고문에 따르면 이번 사고로 최소 $90M 상당이 도난당했고, HN 댓글은 피해 규모가 $100M을 넘을 수 있다고 언급함
Hacker News 의견들
이 글은 'runs' 커밋 작성자가 악의적이지 않았다고 그냥 전제하고 가는데, 그게 확인된 사실임? 본문엔 그런 근거가 없음
할런의 면도날 원칙 생각하면 되지 않나, 굳이 악의로 볼 필요 없음
애초에 C로 이런 걸 짜는 것 자체가 버그를 자초하는 거임. 요즘 LLM 있으니 Lean이나 최소 Rust로 짰어야지
고의로 안 했다는 것만으론 부족함. 이 코드가 뭘 하는지 제대로 이해하면서 안 짠 게 문제인 거임
이 사람 다른 커밋들도 다 찾아봤는데 죄다 커밋 메시지가 부실함. 조직 차원에서 사람 교체하거나 암호화폐 프로젝트엔 좋은 커밋 메시지를 필수로 만들어야 함
손실이 \개진 \1억달러는 넘을 텐데 이 정도 부주의면 이 사람들 감옥 가야 함
이 글은 사실 잘 쓴 글이 아님. 진짜 기술적 원인은 밑에 nullc 설명 보는 게 나음. 나쁜 커밋 메시지가 곧 나쁜 코드라는 걸 증명하려 든 게 이 글의 문제
실제 원인은 값 검사와 정의 여부 검사를 혼동한 거임. 콜드카드는 마이크로파이썬의 하드웨어 TRNG 래퍼를 자기들 코드로 교체하려 했는데, 마이크로파이썬 쪽은 #if로 게이트되고 콜드카드 대체 코드는 #ifndef로 게이트돼 있었음. 그래서 MICROPY_HW_ENABLE_RNG (0)으로 마이크로파이썬 구현은 꺼졌는데 콜드카드 자체 구현도 활성화가 안 됨. 이게 다른 저장소에 걸쳐 있어서 더 놓치기 쉬웠음
MISRA가 2012년부터 있었는데 이런 값 대 정의 여부 혼동 관련 규칙이 없다는 게 좀 놀라움
엔트로피 값을 끝까지 추적해서 어떤 소스에서 왔는지 검증하는 taint 분석 같은 걸 LLM으로 자동화할 수 있지 않을까 싶음
글 스타일은 마음에 안 들어도 엔지니어링 관행이 부실했다는 지적 자체는 맞음. 커밋을 더 작게 쪼갰어야 하고, 자동화 테스트가 부족했고, define을 여러 저장소에 걸쳐 쓴 게 복잡성을 키웠음. 그래도 사람을 비난하기보다 뭐가 잘못됐는지 분석하는 게 먼저임
나는 'HW RNG 끄기'가 fault 처리를 더 강화하는 거라고 생각한 적 한 번도 없음. 그냥 꺼지는 거라고만 생각했음
랜덤 넘버 생성기가 진짜 랜덤을 안 뿌리는 버그는 누군가 의도적으로 시스템을 뚫으려 할 때 쓰기 딱 좋은 버그임. 뇌물이나 정보기관 개입 의심됨
5년이나 기다렸다가 터뜨렸다고? NSA가 그렇게까지 해서 노릴 만큼 이 지갑에 큰돈이 들어올 줄 알았다는 거임? 관련자들 다 감시 대상 될 텐데 갑자기 요트 사면 바로 걸림
트위터 권고문에 보면 'AI 지원 코드 리뷰가 이제 업계 최고 전문가들보다 더 빠르게 잠재적 버그를 찾아낸다'고 나옴. 오픈소스든 아니든 공개된 적 있는 펌웨어는 이미 공격자와 방어자 모두가 읽고 있다고 봐야 함
업계 최고 전문가라는 사람들이 지금 LLM으로 자기 코드 취약점을 먼저 찾고 있지 않다면 전문가가 아니라 광대인 거임
소스가 닫혀 있어도 바이너리만 있으면 지금 기술 수준으론 큰 장벽 아님
'Not your keys, not your coins'라면서 콜드월렛까지 썼는데도 결국 이렇게 당했음. 소프트웨어 버그가 절대 없어야 한다는 전제에 의존하는 금융기술에 재산을 맡기는 게 맞는 건지 모르겠음