KAIST 2차 면접 후기

Record 2009/11/30 22:40

포스팅 을 마치고 바로 잠을 청했으니 7시간 정도 잘 수 있었던 것 같다. 5시 20분 경부터 조금 추워서 잠을 자는둥 마는둥 한 것을 빼면 말이다.

7시에 경하 호텔 2층의 한식당에서 미리 예약을 해 놓은 설렁탕으로 아침을 해결했다. 맛은 제법 괜찮지 않았나 싶다. 김치가 많이 맛없었다고 하지만, 원래 밖에서는 김치를 잘 먹지 않는 터라 안 먹어봐서 모르겠다.
7시 20분 호텔을 떠나서 금세 KAIST에 도착했다. 면접은 세 고사장에서 나누어 보았지만, 일단은 차는 창의학습관 터만홀 앞에서 모두를 내려줬다. 창의학습관 앞에는 선배들이 플랜카드를 치고 기다리고 있었다. 그것도 은근히 학교간 경쟁이라, 얼마나 요란하게 환영(?)해 주는지를 놓고 신경전까지 있었다. 멋있게 플랜카드를 인쇄해서 붙여 놓거나, 문 앞에 양쪽으로 서서 교가를 부르는 학교들도 있었지만, 인곽 선배들은 보다 현실적으로, 신입생 환영회 장소와 시간을 가르쳐 주셨다.

면접 대기장소인 터먼홀에 8시 20분까지 입실하여 출결 확인을 했다. 그러나 왠지 출결 확인부터가 GIST에 비해 뭔가 많이 미숙하다는 인상을 받은 것은 비단 나만이 아닐 것이다. GIST가 10분 만에 깔끔하게 인원 확인과 명찰 배부를 완료한 것과는 대비되게, 30분이 넘도록 결시자가 파악되지 않아서 쩔쩔 맨 것은 이미 몇 번이나 입시를 치러 본 KAIST답지 않아 조금 실망한 것이 사실이다.

9시부터 본격적인 면접이 시작되었다. 한 사람에 30분씩. 나는 25 면접실에서 세 번째로 면접을 치르게 되었다. 10시 40분이 조금 넘어가는 시간에 면접실로 들어갔다. 공지에 의하면, 영어 면접 5분 후에 공통 문항 10분과 개별 문항 10분을 진행하고, 마지막 5분에 자기 역량 발표 시간을 줄 것이라고 하였다. 이에 근거하여 대략의 시나리오를 짜서 면접장에 들어갔는데, 돌연 한국어로 자기소개를 하라고 하셔서 사실 조금 당황했다. 한국어로 자기소개를 따로 준비한 것도 아니고, 결국 내용이 영어 자기소개와 거의 같을 것이었기 때문이다. 그래도 하는 수 없이 대략의 영어 자기소개 내용으로 짧게 답변을 했다.

이후 몇 가지 질문이 오고 갔다. 질문의 내용을 공개해도 되는 것인지 확신이 서지 않기 때문에 일단은 보류하도록 하겠다. 입시에 조금이라도 지장이 있으면 안되니까 말이다. 영어 면접은 맨 마지막에 있었는데, 자기소개와 제시된 그림(도표)을 설명하는 것이 과제로 주어졌다. 그러나 개인 역량 발표 시간은 따로 주어지지 않았다. 본래 5분 동안 발표할 내용을 대략 준비해 놓고 있었는데, 영어 면접이 끝나자 마지막으로 제언을 한 번 해 보라고 하셔서, 어느 정도 길게 해야 되냐고 여쭈니 최대한 짧게 하라는 것이었다. 하는 수 없이 준비해 간 것을 최대한 압축해서 3문장 정도로 짧게 하고 나왔다.

면접후 대기실에서 또 지루한 기다림의 시간을 보냈다. 12시 40분쯤, 모든 면접자의 면접이 끝나자 드디어 그룹 토론을 위해서 25 면접실에서 면접을 치른 6명의 친구들이 모였다. 한성과학고, 서울과학고, 전북과학고, 경기과학고, 장영실과학고에서 온 다섯 명의 친구들이었다. 다행히도 한국과학영재학교 학생이 없어서 좀 편하게 토론을 할 수 있었던 것 같다.

토론 주제 또한 밝히기 힘들지만, 다행히 학교에서 한 번 연습을 해 봤던 주제라서 보다 쉽게 접근할 수 있었다. 같이 토론한 친구들 모두 굉장히 적극적으로 해 주어서 토론이 매끄럽게 진행된 것도 참 다행이었다. 학교에서 연습할 때보다도 더 말을 많이 할 수 있었던 것 같다. 30분이라는 시간이 짧게 느껴질 만큼 여러 의견이 오갔다.

같이 토론한 친구들과 모두들 내년에 캠퍼스에서 보자는 인사를 하고, 면접장을 나왔다. 들리는 말로는 KAIST의 계산 실수로 많은 수가 서울대로 빠지는 바람에 매우 낮은 경쟁률이 형성될 것이라고 한다. 운이 좋다면 정말로 같이 토론을 한 다섯 명 모두 내년에 또 볼 수 있을지도 모르겠다. 진심으로, 그랬으면 좋겠다.

인곽에서 같이 시험 보러 간 친구들과 선배님들 모두 다 같이 합격할 수 있기를 기도해 본다.




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

Uway.com 은 대부분의 대학에서 이용하는 원서 접수 대리 사이트이다. 또한 물리 올림피아드 , 수학 올림피아드 등 각종 올림피아드의 수상자 발표 서비스 및 성적 컨설팅 서비스도 제공한다.

사용자 삽입 이미지

때문에 굉장히 많은 학생들의 신상 정보를 포함하기 마련이다. 사실 대한민국의 모든 수험생의 신상 정보를 담고 있다고 해도 과언이 아니다.

지난 8월 13일 한국 물리올림피아드의 수상자가 온라인으로 발표되었다. 발표 페이지는 Uway에서 제작한 대행 서비스를 사용하고 있었다. 주소는 http://ipsi9.uway.com/ksi/kps/pass/1/index.htm 이며, 이 포스트를 작성할 때는 서비스를 중단한 상태였다.

페이지는 단순했다. 성명과 주민등록번호를 입력하고 확인을 누르면 수상 정보를 알려 주는 것이었다. HTML 코드를 분석해 본 결과 form1이라는 폼에 namekor, juminno라는 이름의 Text field와 mode라는 이름의 hidden field가 있었다. method는 POST 방식을 사용하고 있었으며 onsubmit에는 값 검사 함수가 할당되어 있어 각 필드의 유효성을 검사했다.

여기서 두 가지 흥미로운 점을 발견할 수 있었다. 즉, form1의 action 페이지가 설정되어있지 않았다는 점mode라는 hidden field의 값은 check로 설정된 채 바뀌지 않는다는 점이었다. action에 주소가 할당되지 않으면 submit시 현재 페이지가 리로딩되며 데이터가 전달된다. 즉, action의 기본값은 현재 페이지이다. 따라서 이 페이지는 한 페이지에서 값의 입력과 출력을 모두 담당하며, 입력 페이지를 표시할 것인지 출력 페이지를 표시할 것인지는 mode라는 변수가 check라는 값을 가지고 있는지를 이용해 판단할 것임을 추측할 수 있다.

기본적으로 POST 방식으로 전송되는 데이터는 변조가 쉽지 않다. 따라서 입력 필드를 통해서만 공격을 해야 되기 때문에 공격이 많이 제한될 수밖에 없다. 특히 필드 검사 함수가 있는 상황에서는 더욱 힘들다. 그러나 만약 GET 방식의 파라미터를 받아들일 수 있다면, 입력 검사 함수를 회피하여 더욱 다양한 형태의 공격이 가능하다. 혹시나 하는 기대를 품고 주소 표시줄에 다음을 입력했다.

(생략)/index.htm?mode=check&namekor=홍길동

mode=check은 입력 페이지가 아닌 출력 페이지를 호출하기 위함이며, namekor 필드를 GET 형식으로 넘기고 있다. 결과는 놀라웠다. 데이터 에러가 아닌 '수상내역 없음' 페이지가 떴다. 알고 있는 수상자의 이름을 입력하여 보았더니 수험 번호와 이름, 주민등록번호, 상급, 여름학교 참가 여부가 정상적으로 표시되었다!

이 공격에서 POST로는 어떠한 값도 넘기지 않았다. 심지어 GET으로도 주민등록번호는 넘기지 않았다. 그러나 이름만 가지고도 정상적인 출력을 했으며, 이는 매우 위험하다.

결과를 통해 이 페이지가 범하고 있는 실수들을 추측해보면 다음과 같다.


  1. POST value와 GET value를 구분하지 않고 사용한다.

    서버사이드 언어를 PHP로 사용했을 경우를 예로 들어 보자. PHP에서 POST value와 GET value에 접근하기 위해서는 각각 $_POST['varname'], $_GET['varname']과 같이 사용해야 한다. 그러나 PHP 배포판의 기본 설정상, POST value와 GET value 모두 단순히 $varname으로도 접근할 수 있다. 만약 POST value에 접근하기 위해 $varname을 사용하였는데 공격자가 POST value 대신 GET value를 전달한다면, 프로그램은 GET value를 POST value로 인식하고 사용할 것이다. 물리 올림피아드 수상자 발표 페이지에 대한 공격이 성공한 결정적인 이유는, POST value 대신 GET value를 넘길 수 있었기 때문이다. 만약 두 값이 구분되었다면, mode를 인위적으로 check로 바꾸기는 힘들었을 것이다.


  2. 폼 값을 검사하지 않는다.

    웹 페이지를 작성하며 가장 하기 쉬운 잘못은 바로 값을 전달할 때 송신자와 수신자 중 한 쪽에서만 검사를 한다는 것이다. 로컬로 실행되는 프로그램은 상대적으로 값이 조작될 가능성이 낮기 때문에 값 전달시 한 쪽에서만 검사하는 것도 큰 문제가 되지 않는다. 그러나 웹 프로그래밍에서 값은 언제 어디서 어떻게 조작될 지 알 수 없으므로 언제나 값을 사용하기 전에는 검사해야 한다. 즉, 폼 값을 전송하기 전에 Javascript를 이용하여 유효성 검사를 했다고 하더라도, 서버사이드에서 이 값을 사용할 때에는 다시 유효성 검사를 해야 한다는 것이다. 물리 올림피아드 수상자 발표 페이지가 서버사이드에서 다시 유효성 검사를 했더라면, juminno 필드가 비어 있는 것을 발견하고 에러를 냈을 것이다.


  3. 적절한 Query문을 작성하지 않는다.

    주민등록번호가 전달되지 않으므로 juminno=""라고 예상할 수 있다. 만약 Query가 적절히 작성되었다면, 주민등록번호가 ""인 데이터는 검색되지 않아야 한다. 예상컨대 Query를 작성할 때 해당 필드가 빈 문자열이 아닐 때에만 조건을 추가하도록 한 것으로 보이며, 이는 이 코드가 재활용되기 때문일 것이다. 어떤 수상자 발표 페이지에서는 이름과 수험번호를, 어떤 페이지에서는 수험 번호와 주민등록번호를 요구하는 등 서로 다른 필드를 요구하기 때문에 빈 문자열이 아닌 경우에만 조건을 추가하도록 한 것이 문제의 원인으로 보인다.


만약 모든 가능한 이름에 대하여 Brute-force 공격(마구잡이 대입 공격)을 시도한다면 1초에 10개의 이름을 처리할 수 있다는 가정 하에 약 900시간만에 모든 이름에 대해 공격을 시도할 수 있으며 한국인의 이름은 주요 성씨에 대부분이 모여 있다는 점을 이용하면 훨씬 짧은 시간 안에도 대다수의 이름에 대해 공격을 시도할 수 있다. 이름만으로 주민등록번호를 포함한 수상 정보를 얻을 수 있다는 것은 매우 위험한 일이다.

9월 초에는 한국 수학올림피아드의 수상자가 또 Uway의 페이지를 통해 발표되었다. 코드를 재활용할 것이라는 예상과 같이, 수학 올림피아드와 물리 올림피아드의 수상자 발표 페이지는 출력 형식을 제외하고는 거의 100% 일치했다.

사용자 삽입 이미지

단일 페이지에서 mode 변수를 이용해 출력을 컨트롤하는 점, POST value와 GET value를 필터링하지 않는 점 등 모든 보안 문제가 그대로였기 때문에 정확히 같은 방법으로 공격을 할 수 있다. 다른 점이라면 출력 페이지에 주민등록번호가 표시되지 않는다는 것이다. 따라서 이름과 주민등록번호를 연결시켜 개인 정보를 얻기 위해서는 이름이 아닌 주민등록번호에 대해 Brute-force 공격을 시도해야 한다.

가장 큰 문제는 보안 의식이다. Uway에서 발생한 문제는 절대 기술적인 문제가 아니다. 공격법이 새로운 것도 아니고, 그렇다고 복잡한 것도 아니다. 심지어 기본적인 PHP 입문서에나 나올 법한 보안 예제이다. 아주 단순하고 초보적인 공격에 개인 주민등록번호를 노출하고 만 것이다. 조금만 보안에 관심을 가졌다면 쉽게 발견하고 고칠 수 있는 문제이다.

문제는 이러한 보안 문제가 이 페이지에만 국한된 것이 아니라는 것이다. 얼마 전 전자신문 에 '학교에서 주민번호가 줄~줄 샌다 '라는 기사가 떴다. Uway와 같이 온라인 서비스가 주된 사업 영역이고, 그 규모도 동종 기업 중 1위라고 자부하는 회사에서조차 너무나 허술한 보안의식으로 심각한 보안 문제가 나타났는데, 학교야 어련하랴 싶은 마음이 들었다.

이제 프로그램을 개발할 때 보안에 신경을 쓰는 것은 필수이다. 프로그래머가 보안을 담당할 수 없다면, 보안 기술자를 고용하는 것이 현명할 것이다. 이 공격법은 주민등록번호 노출에서 그쳤지만, 이와 같은 보안 의식으로 설계한 프로그램이라면 다른 허점도 존재할 것이고, 이는 더 심각한 문제를 야기할 수 있다. 이러한 사태를 맞는 것보다는 보안 분야에 예산을 더 투입하는 것이 훨씬 경제적인 판단이다.

복잡하고 교묘한 공격을 막기는 힘들더라도, 기초적 보안 의식 결여에 의한 보안 허점은 이제 사라지길 바라며 마친다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
사실 인천과학고등학교에 합격하길 바라는 것은 정말로 도둑놈 심보일 것이다. 필자가 다니는 학원만 해도 2학년들이 많이 있고, 학원에 다니지 않더라도 과학고 입시를 위해 몇 년 전부터 준비하는 사람들은 수없이 많을 것이다. 과학고 입시는 그런 '준비된 자들'의 경쟁이다.

하지만 필자가 준비한 기간이라고 해봐야 고작 1달이 조금 넘는 시간. 추석 조금 전부터 학원에 다니기 시작했기에, 다른 아이들에 비해 매우 짧은 시간을 준비한 것이다. 학원을 다녀 보니, 그 전에 한 공부는 했다고 할 수가 없는 정도였다. 학원 내에서만의 경쟁 또한 엄청났고, 그 경쟁에서 살아남기 위해 잠을 줄여 가며 늦게까지 공부하는 아이들을 보고 나는 지금까지 무얼 했나 하는 생각도 들었던 것이 사실이다.

그렇게 한달여를 공부하고 친 시험, 사실 기대하는 것이 욕심일 지도 모른다. 하지만, 주위 사람들을 실망시키고 싶지 않은 마음까지 욕심이라고 해야할까. 부모님과 선생님들, 친구들과 주위의 수많은 눈들. 사실 과학고에 입학하고 싶은 마음보다는 그들을 실망시키고 싶지 않은 마음이 더 컸던 것 같다. 그 마음 때문에 다시 기대를 하게 된다.

새벽같이 일어나 영종도를 향하면서 내가 이 길을 한 번 더, 아니, 두 번이고 세 번이고 더 건너 다닐 수 있으면 얼마나 좋을까 하는 생각을 하며 영종대교를 건넜다. 도심을 벗어나니 한층 더 아름답게 물들어 있는 단풍을 감상하며 달리는 길은 여행의 느낌을 주기도 했지만, 그렇다고 여행 기분이 나지는 않았다.

전에도 이런 저런 일 때문에 몇 번 가 보았던 곳이라 그리 낯선 곳은 아니었다. 사람들이 모여 있는 곳으로 가서 고사장을 확인하고 입실했다. SS님과 같은 고사장이어서 왠지 모르게 안심이 되기도 했다. 시간표를 확인해 보니, 1교시가 수학(70분), 2교시가 물리·생물(50분), 3교시가 화학·지구과학(50분)이었다. 예상 외로 짧은 시험 시간에 시험문제가 쉽겠구나 하는 생각이 들었다. 시험문제가 쉽다는 것은 그만큼 커트라인이 올라간다는 의미이고, 실수를 많이 하는 나에게 있어서는 어쩌면 불리한 점일 수도 있었다.

그렇게 시험이 치러졌다. 문제는 기억도 안나거니와, 악마의9시저주님의 말씀과 같이 문제를 공개했다가 어떤 불이익을 당할지 모르기 때문에 적지 않도록 하겠다. 다만, 수학이 조금 어려웠을 뿐 과학 문제는 무난했다는 것을 밝힌다. 추후에 들리는 소리를 종합해서 판단해 보건대, 수학 문제는 실수와 모르는 문제를 포함해서 반이 넘도록 틀린 것 같다. 과학은 거의 대부분의 문제가 서술형이었기 때문에 적당히 서술을 했을 경우 부분점수를 기대할 수 있었다. 이 점을 노리고 별도의 설명을 요구하지 않은 문제에서도 최대한 서술을 하려고 노력했다.

돌아오는 영종대교를 달리며, 이제 드디어 시험이 끝났구나 하는 생각과 함께 한 번 더 시험(3차)을 보고 싶다 는 생각이 들었다. 스스로도 과욕이라고 질책하면서, 그래도 희망의 불씨는 끄지 않은 채.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry