2021 사이버 보안 챌린지 후기
이번 글에서는 동아리 사람들(+a)과 나간 2021 사이버 보안 챌린지에서 평가를 위한 공격 탐지 시스템(IDS)를 만들면서 경험한 후기에 대해 이야기 해 보고자 한다.
별로 긴 내용은 아니지만 그래도 까먹기 전에 정리하면 좋을 것 같아서 써본다.
사이버 보안 챌린지?
사이버 보안 챌린지는 자동차 보안 R&D 경진대회로서 자율주행차량 보안 기술 확보를 위한 공개 경진대회이다.
대회 운영진 측에서 제공하는 차량 인포테인먼스 시스템(Automotive Grade Linux, AGL)에 대해 공격 + 공격 탐지를 위한 IDS 개발 두 부분을 모두 고려해서 개발해야 했다.
평가 기준
각 팀에서 찾은 취약점을 이용해서 공격을 재현(reproduce)하고, 공격 대상 환경의 저널 로그만을 기반으로 하여 탐지를 진행하는 방식이였다.
공격 시간을 맞추는 경우 점수를 얻을 수 있지만, 오탐한 경우 점수가 깎이기 때문에 최대한 정탐을 하는 것이 중요했다.
공격 벡터는 Wi-Fi, Bluetooth 등 다양했지만, 탐지 경로가 저널 로그 하나라 좀 부족한 점이 없진 않았다.
개발 과정
이 대회에서 사용한 공격 탐지 시스템을 개발한 과정은 다음과 같다.
1. 공격 로그 수집
일단 개발 하기 전에 우리 팀에서 수집한 공격 로그와 정상 환경의 로그 모두 필요했다. 이게 있어야 개발을 할 때 기준이 되고 또 테스트를 진행할 수 있기 때문이다.
대회 규정에서는 15분간 로그를 수집한다고 했기 때문에 모든 로그에 대해 15분간 수집을 진행했다.
2. 로그 정규화
어짜피 동일 환경에서 구현되기도 했고 JSON으로 남았기에 생각보다 정규화 하는 과정은 어렵지 않았다.
하지만.. 제일 어려운 점은 로그 파일은 하나인데 여러 프로세스(agl-dashboard, agl-hvac등)가 동시에 로그를 남기고 있단 사실이였다.
즉, A 프로세스의 sequence 10에 해당하는 로그 다음에 B 프로세스의 sequence 5에 해당하는 로그가 올 수 있다는 점이며 프로세스가 많기 때문에 어떤 로그가 남을진 아무도 모르는 상황이였다.
여기서 주목할 점은 우리가 프로세스 별로는 sequence가 일정하다는 부분이다. 이러한 점을 이용하여 어떤 프로세스에서 로그가 남았는지 분리할 수 있다.
3. 탐지 엔진 뼈대 제작
어짜피 탐지 룰을 가장 잘 아는 사람은 공격 POC를 작성한 사람이라 나는 그들이 잘 룰을 작성할 수 있게 그 뼈대를 제공하는데 초점을 두었다.
엔진에서 로그를 추출하면 여러 항목들이 있었지만 실질적으로 아래 항목들만 필요하기에 다른 로그들은 최초에 로그를 읽는 과정에서 사용하지 않았다.
항목 | 설명 | 특이사항 |
---|---|---|
_PID | Process ID | 리눅스 PID |
_UID | User ID | 프로세스 User ID |
_GID | Group ID | 프로세스 Group ID |
__REALTIME_TIMESTAMP | 시간 | 로그가 기록된 기준 시간을 timestamp로 저장한다 |
_EXE | 프로세스 | 프로세스명 (e.g. agl-dashboard) |
MESSAGE | 메시지 | nested object 처럼 json이 될 수도, 그냥 plain-text message가 될 수도 있다. |
4. 설정 값 업데이트 기능
AGL에서는 설정 값이 변경되면 그 정보를 로그에 남기도록 개발되어 있다. 예를 들어 공기정화시스템(HVAC) 값이 활성화 되면 ` hvacSocketSet `값이 0에서 1로 변경되었다는 사실이 로그로 남게 된다.
대부분 공격이 비정상적 경로를 통해 설정 값을 바꾸거나 하는 것이 많아서 이러한 설정 정보를 가져올 수 있도록 하는 것이 중요했다.
5. 성능 개선
처음 성능 측정을 했을 땐 모든 row의 값을 python built-in library인 json으로 읽었기에 성능이 느렸다.
팀원들과 여러 이야기를 하면서 성능 개선에 대해 이야기를 해 보았고, pandas
가 더 빠르다는 상섭이형의 이야기를 들었기에 실제로 테스트를 진행 해보니 더 빨라서 pandas
를 도입하게 되었다.
그리고 탐지 부분에서도 값을 비교하는 과정에서 정규표현식을 많이 사용하였다.
사람마다, 그리고 코드에 따라 다른 수 있었지만 성능 측정을 하는 과정에서 split
를 사용해서 자르고 비교하는 과정보다 간결하고 빠르게 작성할 수 있어서 정규표현식을 많이 사용했다.
6. 고도화
알려지지 않은 공격에 대해서 커버리지를 늘리기 위해 머신러닝을 사용했다.
우리 팀이 찾은 공격에 대해서는 룰로 작성하지만, 우리 팀이 놓쳤던 부분에 대해 보완할 수 있는 방법으로 머신러닝을 일부 도입하였다.
대회 결과
율곡관605B라는 팀명으로 동아리 사람들(+a)이 출전하였고, 최종 2등으로 대회를 마무리하였다.
나는 입사한지 얼마 안되서 대회 현장에 갈 수 없었지만, 그래도 다른 분들이 잘 대응 해주셔서 좋은 성적으로 마무리 할 수 있었던 것 같다.
특히 이번 대회에서 찬모가 내 멱살 잡고 와서 이렇게 잘 끝낼 수 있었던 것 같다 :)
그리고 6개월 뒤
이 글을 쓰는 시점은 대회 본선 이후로 6개월이 지났다.
사실 당시 기록과 기억을 찾아가면서 쓰는거라 틀린 부분이 있을 수도 있다.
그 부분을 고려하면서 그냥 얘는 이렇게 생각했구나~ 정도로 읽으면 좋을 것 같다.