악성코드를 알아야 공격에 대한 대비를 할 수 있다. 악성코드를 잘 감지하는 것은 중요하다. 그래야 막을 수 있기 때문이다.
악성코드는 네트워킹이 생기면서 많아졌다.
1990년대까지는 모든 악성코드를 바이러스로 불렀는데, 바이러스와는 행동패턴이 다른 것들이 나와서 바이러스는 악성코드의 여러 종류 중 하나가 됐다.
악성코드에는 랜섬웨어 문제가 따라온다. 랜섬웨어란 피해자 PC의 중요한 파일들을 불법으로 암호화하고 풀어주는 대가로 돈을 요구하는 것. 일종의 인질극이다.
악성코드는 크게 바이러스, 웜, 트로이목마로 나뉜다.
1. 바이러스
바이러스 코드가 프로그램에 주입되면, 컴퓨터를 망가뜨린다. 보통 유입되는 경로는 이메일과 usb 이다.
우리 몸에 침투하는 바이러스처럼 온전한 생명체가 아니라서 혼자 스스로 존재를 못한다. 숙주가 있어야 한다.
숙주에 붙어있다가 숙주가 실행될 때 같이 실행되고, 다른 프로그램들에 자기복제를 한다. 결국 컴퓨터에 문제가 생긴다.
운영체제들이 여러가지 바이러스를 대항하는 패치를 계속 만든다. 귀찮지만 패치는 계속 잘 해야된다.
바이러스의 종류를 살펴보자.
- 부트바이러스 : 컴퓨터를 켜는 것을 부팅이라고 한다. 부팅할 때 동작하는 바이러스이다.
부트 섹터를 공격하는거라 운영체제가 제대로 동작하기 전에 작동한다. 플로피 디스크가 사용되던 1990년대에 주로 활약했다.
- 파일바이러스 : 바이러스가 메모리에 상주하면서 실행되는 실행되는 모든 파일에 자기복제하여 감염시키는 바이러스이다.
보통 프로그램을 실행시키면 이게 메모리로 로딩된 후 실행된다. 실행되는 프로그램에 감염시키기 위해 메모리에 살고있는 셈이다.
백신 프로그램을 피하기 위해 자신의 코드를 암호화해서 저장하거나 은폐기능으로 일정기간 잠복하고 코드를 주기적으로 변경한다.
코드를 주기적으로 변경하는 바이러스를 다형성 (Polymorphic) 바이러스라고 한다.
- 부트/파일 바이러스 : 부트섹터와 실행파일을 모두 공격하는 바이러스다. 대표적인 예로는 Invader, Euthanasia, Ebola가 있다.
- 매크로바이러스 : MSoffice에는 매크로라는 기능이 있는데, 이 바이러스는 MSoffice의 일반문서의 매크로영역에 악성코드를 넣어 감염시킨다.
앞선 내용들은 실행파일을 감염시키지만, 이 바이러스는 오피스의 매크로 영역의 문서파일을 감염시킨다는 점에서 차별화된다.
옛날 MS사에서는 office가 실행되면 매크로가 자동 활성화되도록 해뒀기에 굉장히 많은 피해를 입었다.
MS가 매크로 기능을 기본 비활성화로 전환하면서 확 감소했다.
감염되면 컴퓨터가 느려지고 하드와 cpu 용량이 줄어든다. 사용 안하는데 하드디스크가 작동되거나 실행파일 크기/시간이 변경된다.
이러한 바이러스를 막기 위해 백신프로그램이 만들어졌다.
바이러스의 전형적인 패턴을 잡아내서 막아내는 프로그램이다. 새로운 패턴이 등장하면 당연히 당할 수밖에 없다. 얼른 막아내고 지속적으로 갱신해야한다.
대표적인 백신 제조사는 다음과 같다.
2. 웜
웜은 바이러스랑 다르게 독립적으로 존재할 수 있다. 그래서 네트워크를 타고 다른 시스템으로 퍼진다. 자기 자신을 다른 시스템으로 전파시킨다.
대부분 OS의 취약점을 악용한다. 감염된 컴퓨터의 cpu를 낭비해서 망가뜨린다.
백신이 바이러스를 잡기위한 코드는 맞는데, 요즘 백신은 악성코드 전체를 대상으로 한다. 그래서 웜도 백신으로 치료, 방어할 수 있다.
최초의 웜은 모리스 웜이다. 코넬 대학교에 다니던 학생이 배포했다.
당시 UNIX 운영체제의 취약점을 이용해서 한 컴퓨터에 침투하면 인터넷과 연결된 다른 컴퓨터로 전파했다. 한번 감염되는게 아니라 여러번 감염될 수 있고, 횟수가 커질 수록 피해가 커진다. 당시 인터넷에 접속된 6만대 컴퓨터 중 약 10%가 감염됐었다. NASA, MIT, Stanford, 국가연구소 등등이 감염됐다. 처벌받았다고 한다~...
ILOVEU 또는 LoveLetter이라고 불리는 웜이다. 이메일 제목이 ILOVEU였다. 처음에는 신기해서 열어볼 법하다.
열어보면 첨부파일이 있다. LOVELETTER-FOR-YOU라는 파일을 여는 순간, 컴퓨터 내의 이미지/음악 파일을 모두 망가뜨린다. MS에서는 outlook 주소록에 있는 50명에게 같은 이메일을 전송한다. 이게 웜이 다른 시스템으로 전파하는 방식이다. 이걸 Mass Mailer 웜이라고 한다.
첨부파일을 의심스러우면 절대 클릭하면 안된다. 스팸 메일은 바로 삭제한다. 내부 보안 교육을 통해 예방한다. 특히 자영업자들에게 주문건이라고 해서 피해가 크다.
님다웜이라는게 있다. 2001년에 발생해서 22분만에 인터넷을 장악한다. MS사의 Windows 계열에 UNIX에 비해 많은 문제가 있었다. 그래서 UNIX에 몰리는 현상이 있는 것 같기도... 얘도 outlook, outlook express에서 이메일을 그냥 여는 것 만으로 첨부파일이 자동으로 실행되는 방식이었다. 메일만 열어도 첨부파일이 자동실행되면서 당하는 것. MS사에서 만든 웹서버인 IIS를 통해 웹서버로 웜이 전파됐다. 그래서 웹에 접속만 하면 접속한 컴퓨터에 웜이 퍼지는 것.
님다를 거꾸로 읽으면 Admin. Windows의 관리자 계정을 이용한다.
공유폴더를 공격하기도 한다. 공유폴더에 이런 실행파일을 넣으면, 공유폴더를 여는 순간 실행파일이 실행된다.
슬래머웜이라는게 있다. 역시 또 MS사의 SQL 서버를 이용한 웜으로 DoS를 만든다.
SQL 서버에서 버퍼를 넘치게 저장하면 안되는데 이걸 막지 못하는 약점을 이용해서 자신을 무한복제해서 무작위로 선택된 IP주소에 이 웜 코드가 포함된 패킷을 전송하고, 반응이 온 IP주소의 SQL서버를 대상으로 다시 이 웜을 전파한다. UDP를 이용하기 때문에 연결을 맺을 필요도 없기에 빠르다.
패킷을 받고 DNS query를 날린다. 그래서 DNS 서버를 다운시킨다.
블래스터웜이라는게 있다.
컴퓨터를 쓰는데 갑자기 중간에 Remote Procedure Call 서비스가 예기치 않게 종료되어 윈도우를 지금 다시 시작해야합니다. 라는 메시지와 함께 컴퓨터가 10초내로 재부팅된다. 이게 계속 무한반복이다. OS를 무한 재시작시켜서 컴퓨터를 사용하지 못하게 하는 것. 지금은 패칭이 되어있다.
웜은 네트워크를 타고 막 다른 컴퓨터에 퍼진다. 그리고 많은 경우, 바이러스처럼 최근에는 같은 시스템 내의 프로그램/파일을 공격하기도 한다.
변종도 많다. 결국 백신으로 치료해야되고, 새로운 것은 대응을 바로 못한다. 그저 빨리 대응할 수 있게 할 뿐이다. 가능한 최선을 다해 패칭해야한다.
권한 관리도 잘 해서 이상한 게 들어오지 못하게 막아야 한다.
3. 트로이목마
트로이목마는 바이러스랑 비슷하게 자체적으로 혼자 동작할 수 없다.
바이러스는 같은 시스템 내 다른 프로그램들로 자가복제하는데, 트로이목마는 자기복제를 못한다.
개인정보를 유출하기 위한 목적으로 프로그램에 기생한다. 겉보기에는 매우 정상적인 프로그램처럼 보이지만, 어느순간 나와서 pc를 망가뜨린다.
요즘에는 시스템의 개구멍 즉, back-door를 뚫어서 외부에서 컨트롤할 수 있게 원격 조종을 가능하게 한다. 자폭 기능을 갖기도 한다.
바이러스처럼 자신을 복제하지 않고 기생하기에, 혼자 네트워크 타고 퍼지지도 않는다.
다만, 원격으로 이 PC를 컨트롤하게되면 이 컴퓨터가 어떤 식으로 사용될 지 알 수 없다. 예시로는 넷버스, 백오리피스, Executor, Striker가 있다.
외부랑 통신을 해야되기 때문에 특정 네트워크 port가 사용된다. 사용하지 않는데도 port가 열려있으면 의심할 수 있다.
4. 스파이웨어 (트로이목마의 일종)
스파이처럼 OS정보, 프로그램 정보 등의 정보를 수집해서 외부에 전송한다. 원격조종 없이 only 개인 정보를 수집하여 전송하는 것이다.
5. 에드웨어 (트로이목마의 일종)
컴퓨터를 켜서 인터넷만 실행하면, 정말 100개정도의 광고창이 다다다다다다다다 뜨는 것이다.
6. 하이브리드 형태 (웜+바이러스)
웜처럼 네트워크로 자동 전파된다. 근데 바이러스처럼 pc 내 다른 프로그램/파일을 감염시키킬 수도 있다.
7. 봇 (트로이목마+웜)
좀비컴퓨터로 만들어서 DDoS 공격을 하는 것이다.
8. 하이재커
사용자를 의도하지 않는 다른 사이트로 이동시키고 팝업창을 띄운다.
9. 가짜 백신프로그램
10. 논리폭탄
답이 없다. 앞에 애들은 새로운 종류라 처음에는 당하다가 특성 분석 후 잡거나 방어할 수 있다. 전형적인 패턴이 있기 때문이다.
근데 논리폭탄은 패턴이 없다. 그냥 코드다. 폭탄처럼 특정 조건이 만족되면 프로그램이 실행되는 것이다.
일반적인 코드처럼 있다가 갑자기 실행되는거라 잡기 어렵다.
cf. 사회공학 보안공격
기술적인 방법 대신 사람 사이의 관계를 이용해서 정보를 빼가는 것이다.
케빈 미트닉은 악명이 자자한 해커다. 굉장히 오랜 기간 FBI에 의해 지명수배되었다. 이 사람이 "기업 정보 보안에서 가장 큰 위협은 컴퓨터 바이러스, 패치가 적용되지 않은 중요한 프로그램이나 잘못 설정된 방화벽이 아니다. 가장 큰 위협은 바로 당신이다"라고 했다.
결국 잡혀서 컴퓨터,핸드폰 못쓰고 유선전화만 쓰게 했는데 유선전화만 가지고 또 큰 금액을 해먹었다고 한다. 책/강연으로 잘먹고 잘 살다가 1년 전에 갔다.
- 쓰레기통 뒤지기 : 가정이나 직장에서 무심코 버리는 메모지,영수증을 수거해서 수집하는 방법이다.
- 어깨너머로 훔쳐보기
- 직접적인 접근 : 긴급한 상황에서 도움이 필요한 척, 심리적 전복 활용, 높은 위치인 사람으로 가장하는 것이다.
- 도청 : 몰래 엿듣는 것
- 편지를 이용 : 마케팅 편지와 설문지로 위장한다. 편지와 동시에 결혼을 걸어서 추가적인 사회 공학 공격을 수행한다.
사회공학은 교육 말고는 답이 없다.
신원증거를 요청, 음성은 위조변조 되기 때문에 음성에 기반해서 오는 것을 경계, 이메일과 팩스는 일단 의심, 서류 분쇄하고, 이상한거 열지말기
최근 SNS로 이상한 게 많이 오는데 조심해야 한다. SMS를 통해 오는 것도 조심하고 SNS 활동에서 개인 정보가 노출되지 않게 조심해야 한다.
피싱 :
파밍 :
스미싱 :
악성코드를 그래서 어떻게 제거할거냐!
1. 코드 정적 분석 : 코드 상태로 잘 들여다보는 것.
악성코드가 소스파일일 리가 없다. 실행파일(PE 포맷)이다. 그래서 코드를 보기 위해서 Disassemble이나 Reversing을 통해 소스를 역추출한다.
기계어나 어셈블리어와 같은 저급 언어로 추출된다. 그래서 최근 보안을 이유로 어셈블리어 랭킹이 올라갔다.
IDA Pro 도구를 통해 PE포맷에서 어셈블리 코드를 추출해준다. 실행 파일에 대한 어셈블리어 소스를 생성하고, 함수 구조와 함수 호출 구조를 생성한다.
무료로는 OllyDbg, Immunity Debugger, WinDBG가 있다.
이런 정적 분석을 피하기 위해, 나쁜 놈들이 코드를 읽기 어렵게 압축하거나 (Packing) 암호화 (Obfuscation)한다.
이건 패킹된 메시지를 되돌리는 Unpacking하여 분석하거나 난독화된 메시지를 가지고 분석한다.
그래서 정적 분석을 하기 위해서는 다 알아야 된다.
운영체제에서 프로세스/스레드, 메모리구조, PE포맷 구조 등
프로그래밍 언어에서 어셈블리어, C/C++ 등
프로그래밍에 대한 지식에서 TCP/UDP 등 네트워크, 레지스트리, 파일 시스템 관련 프로그래밍 등
분석도구에서 IDA Pro, OllyDbg, WinDbg 등
프로세스 모니터링 도구에 대한 지식에서 Process Monitor, DiskMon, TCPView, WireShark 등
2. 코드 동적 분석 : 코드를 직접 실행해서 확인해보는 것.
근데 돌려보면 내 컴퓨터가 망가질 수 있어서 위험하다. 그래서 VMWare같은 가상 머신 상태에서 동작한다. 다시 복원할 수 있게 만들어놓는다.
그래서 이걸 도망치기 위해 나쁜놈들이 가상 머신이면 동작 안하게 하기도 한다.
프로세스를 확인하는 방법으로는 작업관리자, GMER, Process Explorer가 있다.
작업관리자에서 현재 실행되는 프로세스를 확인할 수 있는데, 독특한 이름이나 많은 자원을 쓰면 의심한다. 또 다른 자식 프로세스를 불러서 동작하게만들거나 만들어질 때마다 다른 프로세스 이름을 가지기도 한다.
GMER은 Rootkit을 탐지한다. Rootkit은 프로세스 정체가 드러나지 않게 오리지널 포인터를 감추고, 새로운 포인터인 것처럼 숨긴다.
악성코드를 숨기기 위한 목적이다. 그래서 Rootkit이 돌아가고 있는지 확인해야한다. 프로세스를 숨기려면 Root 권한을 획득해야해서 Rootkit이라고 불린다.그래야 작업관리자를 제대로 볼 수 있기 때문이다.
Process Explorerdms
운영체제 재시작 후에도 다시 실행되는 시작 프로그램 중 악성 코드가 존재할 수 있다. 내가 등록하지 않은 것들이 동작하기도 한다. 이상한게 있는지 확인하는 도구로는 Autoruns가 있다.
가상머신같이 안전한 환경에서 이상한 애를 실행시켜놓고 어떤 짓을 했나 보는 게 동적 분석이다. 확인할 내용은 다음과 같다.
- File Registry 변경내용 확인: 기존 파일을 삭제/변경/생성한다. 변경 결과를 알려주는 것으로는 Winalysis가 있다.
- 연산 수행 과정을 단계별로 쭉 보고 싶은 경우는 Process Monitor, TCPView 도구를 쓴다.
악성 코드를 바이러스 토탈(virustotal.com)에서 확인해볼 수 있다.
악성코드를 제거하는 방법을 살펴보자.
요즘 악성코드는 쉽게 죽지 않는다. 쉽게 들키지도 않고.
프로세스가 돌아갈 때는 삭제가 안되니까 프로세스를 종료시킨다. 그리고
삭제시킬 때 OS를 고장내뜨려서 우리 자료를 없애버릴 수도 있으니, 자료를 무조건 백업하고 시작할 수 있다.
안전모드로 부팅한다. F11을 계속 눌러서 안전모드로 하면 Rootkit이 동작하지 않아서 프로세스를 쉽게 추적할 수 있다. 안전모드에서 악성코드를 삭제하고 재부팅을 하기도 한다. 정상적으로 없어지면 고맙지만, 안전모드에서도 여전히 동작을 안하기도 한다. 포맷을 할 수 있다는 마음으로 비장하게 시작해야 한다.
악성코드 분석은 쉽지 않다. 알아야하는 것도 많다.
이렇게하면 돼!가 안먹힐 때가 많다. 계속 새로운 게 등장한다.
Secure Coding이라는 것을 악성코드 분석 및 실습 수업이 있다.
SW 개발을 할 때 안전하게 하는 방법이다. 보안 취약점이 없게끔 코딩을 하는 것. 시스템을 개발할 때 처음부터 보안 요구사항을 충분히 다 분석하고 보안 요구사항을 충분히 고려해서 시스템 설계하고, 구현할 때 secure coding 적용하고, 보안 취약점에 대해 충분히 테스팅해야한다.
Secure Coding 이 중요한 이유는, 새로 SW를 개발하는데 SW가 갖는 보안적인 취약성이 의외로 많다. 이 SW 개발할 때 충분히 Secure하게 하지 않으면 침입 방지 시스템, 방어벽이 작동하지 않는다. 왜냐면 실행파일 상태이기 때문에 보안되지 않는다. 그래서 막을 방법이 거의 없다.
Secure Coding guide를 CERT, 행정안전부 소프트웨어보안 개발가이드에서 제공한다.
Security를 충분히 고려하지 않고 개발했을 때의 문제를 살펴보자.
1. Memory Buffer overflow
메모리의 버퍼가 넘치는 것. 메모리의 영역은 OS가 사용하는 곳과 user가 사용하는 곳이 나뉘어져 있다.
우리가 접근할 수 있는 영역은 user 메모리 영역이다. 그래서 OS가 사용하는 곳을 사용자가 읽거나 확인하면 컴퓨터가 망가진다.
근데 user가 사용하는 영역이 넘쳐서 시스템 메모리까지 사용한다면, 잘못된 코드가 시스템 OS에 영향을 미칠 수 있다.
최초의 웜의 형태가 이 방식을 이용했다.
예를 들어, 이건 버퍼라는 캐릭터가 저장되는 칸 10개를 만들고, 사용자가 입력한 값을 버퍼에 넣는 일을 하는 C코드이다.
근데 10개 밖에 안 들어가는 buffer에 엄~~청 길게 넣으면, 시스템 메모리 영역에 내용이 쓰여진다.
이 성격을 정확히 알면 나쁜 놈들이 코드를 보고 Overflow되게 유도한다. 다음단계 주소에서 인증을 건너 뛰는 행동을 할 수 있다.
요즘은 사이즈를 제한하면 이 문제가 해결된다. 최신 OS가 패치를 완료했고, 오피스와 어도비에서 SW를 잘 만든 경우도 있고, 되던 안되던 개발자가 Secure coding을 해야한다. HOW?
- 입력 값에 대한 길이를 검증한다.
- 이걸 개발자가 안할까봐 안전한 문자열 처리하는 함수를 만든다.
- 정적 소스 분석 도구로 미리 수정한다.
2. 포맷 스트링
출력할 때 포맷 형식을 쓰게 되어있다. printf 계열의 포맷 함수는 모두 위험하다. 그 중 %n, %hn이 위험하다.
만약 printf에 %로 찍을게 없으면, 어떻게든 해석되게 하고 싶어서 현재 수행되는 메모리 주소를 출력한다. 시스템이 관리하는 내용이기 때문에 유출되면 안되는데 되는거다. 현재 프로그램이 실행되는 시스템 메모리의 주소이다. format을 %s로 제대로 지정해야 한다.
%n은 어떻게 동장하느냐?
printf는 출력에 쓰인다. 근데 %n은 입력으로 동작한다. %n이 나오기 바로 전에 출력이 된 것이 화면에 몇 자리에 걸쳐서 출력이 됐는지를 target 변수에 저장한다. %16d는 16칸에 걸친 거니까 target에는 16이 들어간다.
C에서 주소값은 포인터 변수를 선언해서 10000번지를 가리킬 수 없다. 포인터 변수를 선언하면 %n으로 하지, 포인터에는 주소를 다이렉트하게 넣지 않는다. 근데 %n은 주소가 그대로 드러난다. target이 그다음 포인터를 가리키는 상황이다. 메모리 주소를 알아서도 안되고, 포인터값을 가지는 것도 안된다. 다른 값을 써 넣을 수 있기 때문이다. %n은 결과적으로 쓰지 말라는거다.
포맷 스트링을 이해하기 위해 C가 어떻게 프로세스를 관리하고 함수를 어떻게 부르는지 HW적인 것을 이해해야 한다.
의도치않게 시스템 메모리를 침범할 수 있다. 그래서 주의해야한다. 특히 %n과 %hn을 쓰지 말아야 한다. 코딩하면 정적분석을 한번 거쳐서 위험요소를 제거한다. 요즘은 컴파일러에서 포맷 스트링을 체크를 하긴 하지만 주체적으로 짜는게 좋다.
3. Race Condition (경쟁조건)
자바에서 multi thread 코딩을 할 때 생긴다.
multi tasking = multi process는 ppt 띄우면서 음악을 들을 수 있는 것. 다운로드받을 때 채팅하고 음악 듣는 것.
경우에 따라 process들이 경우에 따라 컴퓨터 리소스를 공유하는 경우가 있다.
카톡에서 파일을 전송하면서 메시지를 동시에 보낼 수 있다. thread간에 같은 파일을 공유할 수 있다.
이럴 때 굉장히 중요하다. Deadlock 문제가 생긴다. 동시에 차가 엉켜서 아무도 접근하지 못하는 것.
프로세스 간 데드락이 걸릴 수 있다. 걔네들이 경쟁상태에 놓인다.
multi thread는 고급 기술이다. 제대로 구현하기 쉽지 않다. 그래서 이럴 때 조심해야 한다.
프로세스 A와 B가 같은 자원에 접근한다고 하자. A는 음악파일이 있나 체크해서 있으면 플레이하고 싶고, B는 음악파일이 있나 체크해서 있으면 삭제하고 싶다.
얘네들의 교통정리를 안해주면, 동시에 음악파일이 있냐고 물어봤을 때 삭제하면 플레이가 안되는 것이다. 잘못 엉키지 않게 해줘야 한다.
악성 목적이라기보다 코딩이 잘 발생하지 않아도 발생할 수 있다. 그래서 한번에 한 process만 접근하도록 동기화를 잘 해야한다.
multi thread는 필요하면 써야한다. 게임할 때 서로 동시에 서로를 향해 총을 쏠 때 multi thread를 꼭 해야한다. 한글입력하는 것도 다 마찬가지이다.
반드시 multi thread를 해야하면 Synchronization을 엄청 신경써서 해줘야 한다.
'Lecture note in Ewha > Cyber Security' 카테고리의 다른 글
보안 솔루션 (0) | 2025.01.13 |
---|---|
접근제어 (1) | 2025.01.13 |
블록체인 (0) | 2025.01.09 |
대칭키, 비대칭키(Kleopatra) 실습 (1) | 2025.01.08 |
해시 및 전자서명 (0) | 2025.01.08 |