안전한 프로그램 만들기
많은 개발자가 프로그램을 작성하면서 보안의 중요성에 대해 들어봤을 것이다. 그러나 막상 안전한 프로그램을 만들기 위해서 무엇을 고려해야 하는지 알지 못하거나, 알더라도 그 치명적임을 체감하지 못해서 가볍게 여기는 경우들이 있다. 이러한 문제의 해결에 도움이 되기 위해 간단한 보안 지식과 해킹 방법들을 공유하는 시리즈를 작성해본다.
해킹
보안의 필요를 알기 위해서는 해킹에 대한 이해가 필요하다. 해킹은 컴퓨터 시스템 또는 네트워크에 불법적으로 접근하거나 제어하기 위해 사용되는 기술 또는 활동을 의미한다. 해커는 개인 정보를 탈취하거나 변조하고, 시스템을 마비시키는 등의 행위를 할 수 있다. 이러한 해킹을 하기 위해 해커는 시스템이나 프로그램의 취약점을 이용하거나, 시스템이나 프로그램을 이용하는 사용자의 심리를 이용한다. 우리는 이 두 방법 중 사회공학적 해킹 방법인 후자를 제외하고, 기술적 해킹에 관해 이야기를 해보도록 하겠다.
취약점
취약점은 컴퓨터 시스템, 네트워크, 소프트웨어 등에 존재하는 보안상의 결함이나 취약한 점을 말한다. 이러한 취약점은 해커나 악의적인 공격자들이 공격을 시도하고 시스템을 침해하는 데 이용될 수 있다. 때문에 개발자들은 이러한 취약점들을 최대한 줄이고, 회피하는 방향으로 프로그램을 만들어야 한다.
•
팔만코딩경에 취약점에 대해 정리해 둔 글이 있다. 확인해보자.
소프트웨어 약점(weakness)과 CWE
신경써야 할 것
시리즈의 본격적인 시작에 앞서, 안전한 프로그램을 만들기 위해 개발자가 신경을 써야 하는 몇 가지에 대해 간단하게 짚어보자.
1.
사용자 입력을 신뢰하지 말자.
나는 보안에서 가장 중요한 1가지를 뽑는다면 이것이라고 생각한다. 사용자의 입력을 신뢰하는 것은, 대문을 열어두고 여행을 다녀오는 것과 마찬가지이다. 데이터가 항상 올바르게 구성되고 제대로 되어 있다고 생각한다면 문제에 직면하게 된다. 대부분의 보안상 취약점은 서버 시스템에 잘못된 데이터를 제공하는 공격자로 인해 발생한다.
입력이 올바른 형식이라고 무조건 신뢰하는 것은 Buffer-Overrun, Cross Site Scripting, SQL-Injection 공격 등과 같은 문제를 일으킬 수 있다.
2.
최소한의 권한을 사용하자.
최소한의 권한 원칙이란 주어진 권한은 최소한 필요한 만큼의 시간 동안 최소한 필요한 만큼의 코드에만 허용되어야 한다는 것이다. 이 원칙을 통해 프로그램에 문제가 발생하더라도, 치명적인 시스템 손상을 예방할 수 있다.
3.
잘 알려진 암호화 방식을 사용하자.
흔히들 잘못 생각하는 것이 잘 알려진 암호화 방식은 쉽게 뚫린다는 것이다. 이것은 잘못된 생각이다. 잘 알려진 암호화 방식이라는 것은 많이 테스트 되고 검증된 암호화 방식이라는 의미다. 오히려 알려지지 않은 암호화 방식을 사용하는 경우, 암호화 방식에 문제점이 있을 때, 이를 알기가 어렵다.