안전한 입출력 처리
1. 개요
안전한 입출력 처리는 애플리케이션, 서버 또는 시스템이 외부로부터 받는 입력과 생성하는 출력을 안전하게 다루는 방법을 의미한다. 입력 처리 시에는 코드 인젝션, 디렉토리 순회 등의 취약점을 예방하기 위해 입력 확인이 중요하며, 화이트리스트와 블랙리스트 방식이 사용된다. 화이트리스트 방식은 허용된 입력만 처리하고 나머지는 차단하여 알려지지 않은 공격에 대한 방어에 효과적이다. 출력 처리 시에는 사이트 간 스크립팅 취약점 예방을 위해 출력 암호화(인코딩)가 사용된다.
-
보안 소프트웨어 -
코드 서명
코드 서명은 코드의 출처와 무결성을 보장하기 위해 공개 키와 개인 키 쌍을 사용하여 코드를 서명하는 기술이며, 소프트웨어 보안 강화 및 출처 확인에 유용하다. -
보안 소프트웨어 -
구글 네이티브 클라이언트
구글 네이티브 클라이언트는 웹 애플리케이션 개발 및 배포를 간소화하고 CPU 종속성 문제 해결을 목표로 개발된 기술로, 다양한 아키텍처 지원, 샌드박싱을 통한 보안 강화, PNaCl을 통한 이식성 향상을 제공했으나 페퍼 API 지원은 2022년 6월에 종료되었다. -
컴퓨터 보안 -
얼굴 인식 시스템
얼굴 인식 시스템은 디지털 이미지나 비디오에서 사람 얼굴을 감지하고 식별하는 기술로, 다양한 알고리즘 발전을 거쳐 보안, 신원 확인 등에 활용되지만, 편향성, 개인 정보 침해, 기술적 한계와 같은 윤리적 문제도 야기한다. -
컴퓨터 보안 -
워터마크
워터마크는 종이 제조 시 두께 차이를 이용해 만들어지는 표식으로, 위조 방지를 위해 지폐나 여권 등에 사용되며 댄디 롤 등의 제작 기법을 통해 만들어지고 컴퓨터 프린터 인쇄 기술로도 활용된다.
2. 입력 처리
입력 처리는 애플리케이션, 서버 또는 기타 컴퓨팅 시스템이 사용자, 클라이언트, 네트워크 등 외부로부터 들어오는 데이터를 어떻게 다루는지에 대한 것이다.
안전한 입력 처리는 코드 인젝션, 디렉토리 순회와 같은 취약점을 예방하는 데 핵심적인 역할을 한다.
2.1. 입력 확인
입력 확인은 데이터를 사용하기 전에 안전성을 검증하는 단계이다.
이를 위한 가장 안전한 방법은 화이트리스트 전략을 사용하는 것이다. 이 방식은 의심스러운 입력을 종료하고 실행을 계속할지를 결정한다.
2.1.1. 화이트리스트와 블랙리스트
화이트리스트는 허용되는 입력 목록을, 블랙리스트는 차단되는 입력 목록을 정의한다. 보안 전문가들은 일반적으로 블랙리스트보다 예측 불가능한 공격을 방어하는 데 더 효과적인 화이트리스트 방식을 선호한다. 한국에서는 개인정보 처리 시, 정보통신망법에 따라 최소한의 정보만 수집하고, 불필요한 정보는 수집하지 않도록 하는 것이 중요하다. 이는 화이트리스트 방식과 유사한 접근 방식이다.
* 화이트리스트 (좋다고 알려진 것들): 좋은 입력으로 알려진 것들의 목록이다. "A, B 그리고 C는 좋다"고 말하는 목록이다.
* 블랙리스트 (안 좋다고 알려진 것들): 안 좋은 입력으로 알려진 것들의 목록이다. "A, B 그리고 C는 좋지 않다"고 말하는 목록이다.
보안 전문가들은 블랙리스트가 우연히 나쁜 입력을 안전하게 다룰 수 있으므로 화이트리스트를 선호한다. 그러나 어떤 경우에 화이트리스트 솔루션은 쉽게 구현되지 않을 수 있다.
2.1.2. 입력 문제에 대한 종료/정지/중단
이것은 매우 안전한 전략이다. 만약 예상치 못한 문자들이 입력에 발생하면, 실행을 중단한다. 그러나 만약 좋지 않게 구현되었다면, 공격자가 시스템에 예상치 못한 입력을 뿌려서 서비스 거부 공격을 유발할 수 있다.
2.1.3. 입력 필터
입력을 필터링하는 방식은 입력 문제들에 대한 종료/정지/중단보다 덜 전통적인 보안 원리로 사용된다.
* 최종 사용자에게 필터 접근 방식의 장점은 보안 메커니즘이 종종 덜 거슬리는 방식으로 동작한다는 점이다. 예를 들어, 만약 "*"가 불법이라면, "I *LOVE* you"는 "I LOVE you"가 되어, 흔한 경우는 아니지만 이상하게 받아들여질 수 있다.
* 필터 접근 방식의 단점은 올바르게 만들기 어렵다는 점이다. 실제로 많은 애플리케이션이 코드의 한 부분에만 적용된 필터를 가지지만, 프로그래머는 실수로 다른 위치에서 필터링되지 않은 입력을 사용할 수 있다.
2.2. 입력 암호화(인코딩)
악의적인 입력을 무력화하기 위해 입력을 암호화한다. 예를 들어, SQL 삽입 공격을 방지하기 위해 특수 문자를 이스케이프 처리한다.
SQL 인코딩: `'' ' OR 1=1 --'`는 `\ \'\ OR\ 1\=1\ \-\-'`로 암호화된다.
PHP에서 이것은 `mysql_real_escape_string()` 또는 `PDO::quote()` 함수를 사용해서 수행될 수 있다.
2.3. 기타 해결책
프로그래밍 언어와 보호 대상에 따라 다양한 해결책이 존재한다.
특히, SQL 삽입을 예방하기 위해서는, 매개변수화된 쿼리 (준비된 문장과 바인드 변수로도 알려짐)가 코드 명료성과 수행 능력을 향상시킬 뿐만 아니라, 보안을 향상시키는 데 유용하다.
3. 출력 처리
출력 처리는 애플리케이션, 서버 또는 시스템이 HTML, 프린팅, 로깅 등 출력을 처리하는 방식이다. 출력에는 사용자, 클라이언트, 네트워크, 데이터베이스 등에서 제공된 입력이 포함되는 경우가 많다는 점을 유념해야 한다.
안전한 출력 처리는 주로 사이트 간 스크립팅 취약점을 예방하는 데 중점을 두지만, 마이크로소프트 오피스 문서나 일부 API를 생성할 때 매크로 삽입을 방지하는 등 다른 분야에서도 중요하게 활용될 수 있다.
3.1. 출력 암호화(인코딩)
암호화는 출력될 내용을 처리하므로, 잠재적으로 위험한 문자열들을 안전하게 만들 수 있다. 일반적으로 안전한 문자로 알려진 문자열들은 종종 그대로 남는다. 간단한 암호화는 `a–z`, `A–Z` 그리고 `0–9`를 내버려 둘 것이다. 다른 문자열들은 예상치 않은 방식으로 해석되며, 적절하게 암호화된 표현으로 대체된다.
HTML 인코딩에서 `<script>`는 `&lt;script&gt;`로 인코딩된다.
PHP에서 이것은 `htmlspecialchars()` 함수를 통해 수행된다.