이 글은 Crash Course의 Computer Science를 보고 정리한 글입니다.
해커들은 그들의 기술적인 지식으로 컴퓨터 시스템에 침입한다. 모든 해커가 나쁜 것은 아니다. 버그를 찾고 시스템의 안정성과 탄력성을 높이기 위해 소프트웨어의 보안 허점을 폐쇄하려는 해커도 있다. 이러한 해커들은 종종 보안 평가를 수행하기 위해 기업 및 정부 기관에 고용된다. 이러한 좋은 해커들은 White Hat이라고 불린다.
한편으론 Black Hat, 악의적인 해커들이 컴퓨터 취약점과 데이터를 도용하고 악용하며 판매한다.
해커의 동기도 매우 다르다. 오락과 호기심으로 행하는 일부 해킹은, 사이버 범죄자가 주로 금전적 이득을 위해 해킹하는 경우이다. 그리고 사회적 또는 정치적 목표를 촉진시키는 기술을 사용하는 hacktivists가 있다.
이것은 단지 빙산의 일간에 불과하다. 여기서는 해커가 컴퓨터 시스템에 침입해서 어떻게 했는지 아이디어를 제시하는 몇몇 고전적인 예를 논의할 것이다.
해커가 컴퓨터 시스템에 침투하는 가장 일반적인 방법은 전부 뒤집어 놓는 것이 아니라, 사용자가 속아서 들어오게 하는 것이다. 이를 사회 공학(Social Engineering)이라고 하며, 사람이 기밀 정보를 누설하거나 컴퓨터 시스템을 공격자가 진입할 수 있도록 설정하게 한다.
가장 흔한 유형의 공격은 피싱(Phishing)이며, 웹 사이트의 계정에 로그인하라는 이메일로 가장 자주 접하게 된다. E-mail에 링크를 클릭하라는 메시지가 존재하고, 이 링크를 클릭하면 일반인들에게는 공식 홈페이지처럼 보이지만 실제로는 악의적인 복제본으로 연결된다. 사용자 이름과 암호를 입력하면, 그 정보는 해커에게 곧바로 전달된다. 그런 다음 해커는 실제 웹 사이트에 그 사람의 아이디로 로그인할 수 있게 된다. 0.001%의 성공률만으로도 백만 건의 피싱 전자 메일이 수천 개의 손상된 계정을 양도할 수 있다.
또 다른 사회 공학적 공격은 Pretexting이다. 공격자가 회사에 전화를 걸어 자신감 있게 자신이 IT부서인 척 말하면서 공격자는 첫 번째 번호로 전화를 걸고, 두 번째로 옮겨 달라고 부탁한다. 이렇게 하면 전화번호가 회사 내부에 있는 것처럼 보인다. 그런 다음 공격자는 자신도 모르게 사용자가 컴퓨터를 손상시키지 않도록 환경을 설정하거나, 암호 또는 네트워크 구성과 같은 기밀 세부 사항을 알려달라고 지시할 수 있다. 공격자는 특히 핵심 직원의 이름을 찾는 것과 같은 사전조사를 통해 설득력을 갖는다.
이메일은 트로이 목마(Trojan Horse)의 일반적인 전송 수단으로 활용된다. 트로이 목마는 사진이나 인보이스와 같이 무해한 첨부 파일로 가장하지만 실제로는 멀웨어라는 악의적인 소프트웨어가 포함되어 있는 프로그램이다. 멀웨어는 다양한 형태를 취할 수 있다. 일부는 은행 신용카드와 같은 데이터를 도용할 수 있다. 랜섬웨어로 알려져 있는 또 다른 멀웨어는 파일을 암호화하고 몸값을 요구할 수 있다.
악성 코드를 실행하지 못하거나 사용자를 들어오게 할 수 없을 때 공격자는 다른 수단으로 강제 침입해야 한다.
하나는 성공할 때까지 모든 조합을 무차별적으로 암호에 대입하는 시도이다. 대부분의 현대 시스템은 시도가 실패할 때마다 더 오랜 시간 동안 점차적으로 기다리게 하거나 특정 횟수의 시도 후에는 완전히 잠그기 때문에 이러한 유형의 공격은 성공하기 쉽지 않다. 이 문제를 극복하기 위한 최근의 해킹 방법 중 하나는 NAND 미러링이라고 불리며, 컴퓨터에 물리적으로 액세스 할 수 있는 경우, 장치의 메모리 칩에 와이어를 연결하고 내용물을 완벽하게 복사할 수 있다. 이 설정을 사용하면 장치가 정지할 때까지 일련의 암호를 시도할 수 있다. 장치가 잠길 경우 메모리를 원래의 복사본으로 다시 채우고 본질적으로 재설정하여 기다리지 않고 더 많은 암호를 즉시 시도할 수 있다. 하지만 현재 많은 장치에는 이러한 유형의 공격을 저지하는 메커니즘이 포함되어 있다.
기기에 실제로 액세스 할 수 없는 경우 인터넷을 통해 원격으로 해킹할 수 있는 방법을 찾아야 한다. 일반적으로 공격자는 시스템의 버그를 찾아서 활용하고, 버그를 활용하여 성공적으로 기능이나 접근 권한을 얻는 것을 악용이라고 한다.
한 가지 일반적인 유형의 악용 방법은 버퍼 오버 플로운(Buffer Overflow)이다. 버퍼는 일반적으로 데이터를 저장하기 위해 예약된 메모리 블록을 뜻한다.
간단한 예로, 운영체제의 사용자 이름과 비밀번호 필드가 있는 로그인 프롬프트를 상상해 보자. 내부에서 이 운영 체제는 입력된 텍스트 값을 저장하기 위해 버퍼를 사용한다. 설명을 위해, 이 버퍼들의 크기를 10으로 지정하겠다. 메모리에 두 개의 텍스트 버퍼가 생긴다. 물론, 운영체제는 사용자 이름과 암호 이상을 추적하므로 메모리에 이전과 이후의 데이터가 모두 저장된다.
이제 사용자가 사용자 이름과 암호를 입력하면 값을 버퍼로 복사하여 확인할 수 있다. 버퍼 오버 플로우 공격은 정확히 이름에서 알 수 있듯, 버퍼를 오버플로우 하는 것이다. 이 경우, 10글자 보다 긴 모든 암호는 인접한 메모리 데이터를 덮어쓰게 된다. 때때로 이것은 단지 프로그램이나 운영체제의 충돌을 일으키는데, 중요한 값이 다른 값으로 덮어 쓰이기 때문에 그렇다.
그러나 해커는 목적을 가진 새로운 값을 메모리에 주입하여 영리하게 버그를 더 악용할 수도 있다. 예를 들어, "isAdmin"변수를 true로 설정하는 방법이 있다. 임의로 프로그램의 메모리를 조작할 수 있는 기능으로 해커는 로그인 프롬프트와 같은 것을 우회할 수 있으며 때로는 이 프로그램을 사용하여 전체 시스템을 도용할 수도 있다.
버퍼 오버 플로우 공격과 방어할 수 있는 여러 가지 방법이 있다. 가장 쉬운 방법은 항상 버퍼에 복사하기 전에 길이를 테스트하는 것이다. 이것을 범위 검사(Bounds Checking)라고 한다. 많은 현대 프로그래밍 언어는 범위 검사를 자동으로 구현한다. 프로그램은 가상의 "isAdmin"플래그와 같은 변수의 메모리 위치를 무작위로 추출하여 해커가 덮어쓸 메모리 위치를 알지 못하게 하고, 액세스 권한을 얻는 것보다 프로그램을 중단시킬 가능성을 더 크게 만든다.
프로그램은 버퍼 다음에 사용되지 않는 공간을 남겨두고 값이 변경되었는지 여부를 확인한다. 그럴 경우 공격자가 메모리를 가지고 놀고 있음을 알 수 있다. 이 여유 공간을 카나리아(Canarie)라고 하며, 위험한 상황을 경고하기 위해 광부가 지하로 데려가는 작은 새의 이름을 딴 것이다.
또 다른 고전적인 해킹 방법은 코드 삽입(Code Injection)이다. 거의 모든 대형 웹사이트, 데이터베이스를 사용하는 웹 사이트를 공격하는 데 가장 일반적으로 사용된다. 여기서는 데이터베이스를 다루지 않을 것이고, 간단한 공격 유형의 예제만 다루겠다.
구조화된 쿼리 언어인 SQL(Structured Query Language)라고 불리는 인기 있는 데이터베이스 API를 사용할 것이다. 로그인 프롬프트가 웹페이지에서 실행 중인 장면을 상상해보자. 사용자가 "로그인"버튼을 클릭하면 텍스트 값은 코드를 실행하는 서버로 전송된다. 그 코드는 해당 사용자 이름이 존재하는지 확인하고, 암호가 일치하는지 확인한다. 이를 위해 서버는 아래와 같은 SQL 쿼리로 알려진 코드를 실행한다.
SELECT password FROM users WHERE username = "____";
먼저, 데이터베이스에서 어떤 데이터를 검색할지 명시해야 한다. 이 경우" password"를 가져온다. 서버는 또한 값을 검색할 데이터베이스의 위치를 지정해야 한다. 이 경우 모든 사용자의 데이터는 "users"라고 표시된 테이블의 데이터 구조에 저장되어 있다. 마지막으로, 서버는 데이터베이스의 사용자 이름이 특정 값과 동일한 계정의 데이터만 필요로 한다. 이 값은 사용자가 입력한 내용을 기반으로 하여 SQL 쿼리에 복사되어 ____부분에 놓인다. 또한 SQL 명령은 세미콜론(;)으로 끝난다.
이제 어떻게 해커가 이것을 해킹할 수 있을까? 이는 SQL 명령에 내장된 악의적인 사용자 이름을 전송함으로써 해킹할 수 있다.
whatever"; DROP TABLE users;
해커는 위와 같은 값을 사용자 이름에 넣어 서버에 보낼 수 있다. 서버가 이 텍스트를 SQL 쿼리에 그대로 복사하게 되면,
SELECT password FROM users WHERE username = "whatever"; DROP TABLE users;";
서버가 위와 같은 SQL 쿼리를 데이터베이스에 명령하게 된다. 앞서 언급했듯이, SQL 쿼리는 명령을 분리하기 위해 세미콜론을 사용한다. 따라서 첫 번째 실행되는 명령은 "whatever"이라는 사용자가 있는 경우 데이터베이스가 암호를 반환한다. 물론, 해커는 무엇이 "whatever"의 비밀번호가 무엇인지 모르므로 잘못된 결과를 얻고 서버는 해커를 거부한다. "whatever"이라는 사용자가 없다면 데이터베이스는 암호를 반환하지 않거나 오류를 가져와 다시 서버는 해커를 거부한다. 어쨌든 해커는 상관하지 않는다. 관심을 가져야 할 것은 다음 SQL 명령이다. DROP TABLE users; 이 명령은 SQL 데이터베이스에 모든 사용자 데이터가 저장되어 있는 테이블을 삭제하라는 명령이다. 이 명령이 실행되면 사용자 데이터가 모두 사라져서 은행과 같은 곳, 또는 실제 어디에서나 많은 문제를 일으킬 것이다.
이것은 현재 거의 모든 서버에 방어 기능이 있는 매우 간단한 코드 삽입 예제이다.
버퍼 오버 플로우와 마찬가지로, 프로그래머는 항상 외부에서 들어오는 입력을 잠재적으로 위험하다고 가정하고 신중하게 검토해야 한다. 웹상의 대부분의 사용자 이름과 비밀번호 양식은 첫 번째 방어 수준으로 사용하는 세미콜론(;) 또는 따옴표(") 같은 특수 기호를 포함시키지 않도록 한다.
좋은 서버는 데이터베이스 쿼리를 실행하기 전에 특수 문자를 제거 또는 수정하여 입력을 깔끔하게 만든다(Sanitize).
악용 익스플로잇은 종종 온라인에서 팔리거나 공유된다. 버그가 널리 퍼지거나 손상이 심한 익스플로잇일수록 가격이나 명성이 높아진다. 정부조차도 때때로 스파이와 같은 목적으로 컴퓨터를 해킹할 수 있는 익스플로잇을 구매한다. 소프트웨어가 인식하지 못하는 새로운 악용 가능한 버그가 발견되면 이것을 제로 데이 취약점(Zero Day Vulnerablility)이라고 한다. 블랙 햇 해커들이 익스플로잇을 이익에 최대한 사용하기 위해 몰려든다. 화이트 햇 프로그래머들이 버그에 대한 패치를 내놓기 전까지 말이다. 때문에 컴퓨터 소프트웨어를 최신 상태로 유지하는 것이 중요하다. 최신 패치의 대부분은 보안 패치인 경우가 많다.
버그가 충분한 시스템에 열려 있다면, 해커는 컴퓨터에서 컴퓨터로 자동으로 점프하는 웜이라고 불리는 프로그램을 작성할 수 있다. 해커가 많은 수의 컴퓨터를 조종할 수 있다면, 그것들을 함께 사용해 봇넷(BotNet)이라 불리는 것을 형성할 수 있다. 대량의 스팸메일을 보내고, 다른 사람들의 컴퓨팅 파워와 전기를 사용하여 비트 코인을 채우고, 서버에 대한 분산 서비스 거부(DDoS;Distributed Denial Of Service) 공격을 착수하는 등 많은 목적을 가지고 사용할 수 있다. DDoS는 모든 컴퓨터의 봇넷이 보내는 가짜 메시지들이 있는 곳이다. 이것은 서비스를 오프라인으로 만들어, 주인이 배상금을 지불하거나 악의를 품도록 강요할 수 있다.
사이버 공격은 매일 발생하고 있다. 여기에 세계 경제의 연간 약 5조 달러가 들며, 컴퓨팅 시스템에 대한 의존이 높아질수록 증가할 것이다. 이것은 인프라가 점점 더 컴퓨터로 구동되기 때문에, 정부가 특히 우려하는 부분이다. 동력 장치, 전기 그리드, 교통 조명, 수처리 설비, 정유 공장, 항공 교통관제, 그리고 다른 수많은 키 시스템과 같은 것들이 있다.
많은 전문가들은 다음 주요 전쟁은 사이버 공간에서 싸울 것이라고 예측한다. 국가가 물리적 공격이 아닌 경제적으로나 사회 기반 시설을 무력화하는 사이버 전쟁에 무릎을 꿇을 것이다. 따라서 우리 모두 훌륭한 사이버 보안 관행을 채택해야 한다. 또한 커뮤니티가 인터넷을 통해 상호 연결되어 있기 때문에, 크나큰 잠재적 위험을 이용하고자 하는 사람들로부터 우리들의 컴퓨터 보안을 유지해야 한다.
'컴퓨터공학 > 기초' 카테고리의 다른 글
기계 학습(ML; Machine Learning) 및 인공 지능(AI; Artificial intelligence) (0) | 2022.11.27 |
---|---|
암호화(Cryptography) (0) | 2022.11.20 |
사이버 보안 (0) | 2022.11.06 |
월드 와이드 웹( WWW ; World Wide Web) (0) | 2022.10.30 |
컴퓨터 네트워크 (0) | 2022.10.09 |
댓글