데비안 OpenSSL 버그의 원인

며칠전에 데비안의 OpenSSL에 보안 이슈가 발생했다는 뉴스가 떠서 서버들을 업그레이드 해줬었다. 역시 데비안이 제일 빠르다고 속으로 칭찬했었는데, 오늘 보니 이 문제는 “데비안의 문제”였다.

브루스님의 글을 보고 알았다. 원인은 valgrind 라는 툴로 OpenSSL의 소스를 검사한 메인테이너가

MD_Update(&m,buf,j); /* purify complains */

라는 코드에서 “buf”가 초기화 되지 않았다는 경고를 보고, 간단하게 주석처리 해버린 것.

하지만 이 코드는

#ifndef PURIFY MD_Update(&m,buf,j); /* purify complains */ #endif

라고 -DPURIFY를 주면 비켜갈 수 있었다. 여기서 buf가 초기화되지 않은 버퍼인 것은 맞지만, 난수를 만들기 위해서 일부러 그렇게 한 것이다.

그러니까, 저 MD_Update(…)라는 줄은 OpenSSL 세상에서 가장 중요한, 바로 “난수”를 발생시키는 핵심적인 코드였던 것 !

결과적으로 난수발생기가 동작하긴 했지만 난수의 범위가 그리 크지는 않았다. 조금만 시도해보면 찾아낼 수 있는 정도의 난수였다. (최대 32768 번만 시도해보면 된다.) 이 버그가 만들어진 것은 무려 2년전. 그동안 이 버그를 알고있는 해커라면 OpenSSL에 기반한 ssh 를 해킹할 수도 있었다.

덕분에 메인테이너인 커트는 거의 몰매를 맞는 듯하다. (맞을 만도..)

나는 가끔 OpenSSL 써서 뭔가를 만들때면, 절대로, 절대로, OpenSSL쪽의 소스코드는 수정하지 않는다. 무엇보다도… 겁나잖아? ㅎㅎㅎ (저 라인에서 가만히 코드를 노려본 사람이 나만은 아닌거다.)

P.S.

  1. 브루스 (Bruce Schneier) 님은 RSA의 “S”다. (브루스 슈나이어라고 읽어야 할 것 같다)

  2. 우분투쓰는 사람들도 업그레이드 해야한다.

  3. 이 페이지를 보면 우리가 얼마나 일을 세심하게 해야하는지 새삼 느끼게 된다.

  4. 이것도 추가해둔다.