시큐어코딩
- home
- 보안소식
- 시큐어코딩
30. [보안 기능] 무결성 검사 없는 코드 다운로드
2019.06.24 17:30
안녕하세요 정보보안 전문기업 지에스인포입니다!
어느덧 2019년도 절반이 거의 다 지나가고 있네요. 2019년이 된 지 얼마 되지 않은 것 같은데 시간의 흐름이란 참 빠르다는 생각이 드는 요즘입니다.
저희 잇님들은 2019년 새해를 맞아 세운 목표들을 잘 완수 해 가고 계신가요?
지에스인포는 세계 최고의 정보보호 전문기업이 되고자 하는 목표를 향해 오늘도 멈춤 없이 달려나가고 있답니다!
그러면 오늘도 피가 되고 살이 되는 정보보안 공부를 함께 해 볼까요? ^_^ 이번에 배워 볼 항목은 행안부 SW 개발보안가이드 47개 항목 중 '무결성 검사 없는 코드 다운로드' 입니다.
#무결성 검사 없는 코드 다운로드 : 원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고 이를 실행 할 경우, 공격자가 악의적인 코드를 실행 할 수 있는 보안 취약점
소스코드 혹은 실행파일을 무결성 검사 없이 다운로드 받고 실행 할 경우, 공격자가 호스트 서버의 변조, DNS 스푸핑(Spoofing) 또는 전송 시의 코드 변조 등의 방법을 이용하여 악의적인 공격을 할 수 있게 됩니다.
이를 방지하기 위해서는 DNS 스푸피(Spoofing)을 방어 할 수 있는 DNS lookup을 수행하고 코드 전송시 신뢰 할 수 있는 암호기법을 이용하여 코드를 암호화 하는 것이 중요한데요. 또한 다운로드한 코드는 작업수행을 위해 필요한 최소한의 권한으로 실행하도록 해야 합니다.
그러면 코드 예제와 함께 보실까요?
위 코드 예제는 JAVA 언어에서 URLClassLoader()를 통해 원격에서 파일을 다운로드 한 뒤 로드하면서, 대상 파일에 대한 무결성 검사를 수행하지 않아 파일변조 등으로 인한 피해가 발생 할 수 있는 경우입니다. 이러한 경우 공격자는 악의적인 실행코드로 클래스의 내용을 수정 할 수 있게 되는데요. 그러한 보안 위협을 방지하기 위해선 아래와 같이 시큐어코딩을 해 주는 것이 필요합니다.
어떤가요? 단 3줄이던 소스코드가 매우 길어졌지요?
암호화 알고리즘을 이용하여 다운로드 받은 파일에 대한 위변조 여부를 검사하는 로직을 추가 해 준 것인데요.
서버의 경우에는 private key를 가지고 myclass를 암호화 해 주는 방식으로 보안 점검을 해야 합니다.
이렇게 하나의 보안위협을 방지하기 위해서도 많은 공수가 들어간다는 사실을 알 수 있는데요.
많은 개발자들이 시큐어코딩을 접목해서 개발을 하기 어려워하는 이유이기도 한데요. 그렇다고 귀찮음에 편리함을 추구하는 코딩만 하다가는 심각한 보안위협에 노출 되어 큰 피해를 겪을 수 있다는 사실을 잊으면 안 되겠습니다.
원래 안전을 기하기 위해서는 약간의 수고로움이나 귀찮음은 감수해야 한다는 것! 대신 그 결과는 수백배 값진 열매로 돌아온다는 것을 모두 기억해 보아요 ^^
그럼, C# 으로 한 가지 더 예시를 보시겠습니다!
위 예제는 로드되는 코드의 무결성을 확인 할 수 없어 해당 코드가 올바르게 로딩 되었는지 보장 할 수 없습니다.
이러한 경우 공격자는 악의적인 실행코드로 클래스의 내용을 수정할 수 있는데요.
그러한 위험을 방지하기 위해선 위의 예제처럼 클래스를 로드하기 전 strong-named Assembly 를 실행하여 로드하는 코드가 변조되지 않았음을 확인 해 주는 로직이 프로그램에 설정되어 있어야 합니다.
어때요? 다운로드 받은 파일의 위변조 여부를 검사 해 주는 과정 하나만 거쳐도 많은 보안 위협을 방지 할 수 있다는 사실! 호미로 막을 것을 가래로 막는다는 속담처럼, 소프트웨어 개발에 있어서도 코딩 단계에서부터 보안 위협을 방지하는 시큐어코딩의 수고만 조금 더 해주면 미래에 훨씬 큰 피해와 많은 수고로움을 방지 할 수 있다는 지혜를 되새기며 지에스인포는 여기서 물러가겠습니다!
다음에 또 알찬 정보 보안 소식으로 함께해요~