Post

컴퓨터 보안

컴퓨터 보안

보안과 프라이버시

위협 모델

  • 보안이 필요한 대상 목록과 각 보안 대상에 가해질 수 있는 공격을 열거해 이런 공격을 방어할 방법을 설계할 수 있게 한다.
  • 보안 수준과 위험도, 비용 등 여러 요소를 고려해 위협 모델에 적합한 방어를 설계해야 한다.

신뢰

  • 현대에 많은 기술의 발전을 거치면서 다양한 대상과 공격 방법들이 생기면서 신뢰할 대상을 선택하는 것은 어렵다.
  • 신뢰할 대상이 늘어날 때마다 보안이 감소한다는 딜레마도 있다.
  • 서드파티도 사용은 해야하지만 보안이 떨어지는 딜레마가 존재한다.
  • 의도적, 무능, 부정직 신뢰 위반을 고려해서 신뢰할 대상을 선택해야 한다.

물리적 보안

  • 대상을 물리적으로 지키는 것이다.
  • 대상에 접근할 수 있는 권한을 부여해 권한이 있는 경우만 접근할 수 있다.
  • 물론 권한을 어떻게든 취득하거나 탈취해서 접근할 수도 있다.
  • 접근을 편하게 하기 위해 다른 접근 방법을 열어두는 경우도 있는데 이런 경우를 활용해 접근하는 백도어도 있다.

통신 보안

  • 통신에서는 인증 과정을 통해 대상에 접근할 수 있는지 확인한다.
  • 인증을 위조해서 통과하는 공격 표면 외에도 정보를 가져간 후에 변경하거나 악의적으로 행동하는 경우도 있다. (신뢰성)
  • 두 당사자의 중간에 공격자가 들어가 통신을 가로채거나 변경하는 중간자 공격이 있다.
  • 이러한 상황들을 크립토그래피를 통해 해결할 수 있다.
  • 수신자만 아는 비밀 코드로 내용을 암호화해서 전달하고, 수신자는 비밀 코드로 복호화해서 내용을 읽는다.

모던 타임즈

  • 현재는 다양한 대상, 다양한 방식으로 공격이 발생한다.
  • DoS/DDos 공격 같은 것들이 대표적이다.
  • 프록시 때문에 공격자를 추적하기도 쉽지 않아졌다.
  • 크립토그래피 시스템 공격은 잘 설계된 시스템을 공격하는 것이기에 어렵다.
  • 사회적 공격이 쉽다.

메타데이터와 감시

  • 내용을 직접적으로 살펴보지 않고 통신 패턴을 관찰하는 것만으로도 많은 정보를 얻을 수 있다.
  • 데이터 자체에 대한 정보가 아닌 데이터에 대한 설명 등을 담고 있는 메타데이터 같은 것을 관찰할 수 있다.

사회적 맥락

  • 보안은 사회적 문제이기도 하지만 나라마다 다른 문제이기도 하다.
  • 통신은 국가 간의 통신을 쉽게 가능하게 발전했지만, 이러한 각기 다른 관습과 법으로 인한 문제가 복잡하다.

인증과 권한부여(인가)

  • 인증은 대상이 일치하는 대상인지를 증명하는 과정이라면, 인가는 인증된 대상이 권한이 있는지를 확인해서 제한하는 과정이다.
  • 최근에는 2단계 인증(2FA)을 많이 사용한다.

크립토그래피

  • 정해진 수신자만 수신할 수 있게 해주는 것 외에도 위변조를 막거나 감지할 수도 있다.

스테가노그래피

  • 내용을 다른 내용 속에 감추는 방식이다.
  • 송/수신자 사이에 연결 기록이 남지 않는다.

치환 암호

  • 각 문자를 다른 문자로 변환하는 표를 통해 메시지를 암호화하거나 복호화 한다.
  • 원본 메시지를 평문, 암호화된 메시지를 암호문이라고 부른다.
  • 암호화와 복호화에 같은 암호를 사용하는 대칭키 방식이다.
  • 통계를 통해 치환 암호를 깰 수 있어서 취약하다.

전치 암호

  • 문자 위치를 뒤섞는 방식이다.
  • 스키테일, transposition cipher라고도 부른다.
  • 마찬가지로 쉽게 풀 수 있어서 취약하다.

일회용 패드

  • 중복되지 않는 유일한 치환 암호들의 모음이다.
  • 제대로 사용하기만 하면 완전히 안전하다.
  • 양쪽이 같은 패드를 써야 하고, 동기화돼야 한다.
  • 패드가 메시지만큼 길어야 한다.

키 교환 문제

  • 대칭 암호 시스템은 양쪽이 같은 키를 사용해야 한다.
  • 중간에 가로채도 알 방법이 없다.
  • 키가 망가지거나 손상 되면 쓸모가 없어진다.
  • 즉, 중간자 공격에 취약하다.

공개키 암호

  • 서로 연관된 키 쌍을 사용한다.
  • 누구나 알고 있는 공개키로 암호화하고, 본인만 알고 있는 비밀키로만 복호화 할 수 있다.
  • 공개키 암호는 트랩도어 함수에 의존한다.
  • 트랩도어 함수는 한 방향으로 계산은 쉽지만, 비밀 정보를 알지 못하면 반대 방향으로 계산이 어렵다.
  • 트랩도어 함수를 계산할 수 있는 정보를 공개키, 쉽게 풀 수 있게 해주는 비밀 정보가 비밀키다.
  • 비대칭 암호화는 계산 비용이 많이 든다.
  • 그래서 비용을 줄이기 위해 잠시 대칭 방식으로 계산하려고 대칭 세션 키를 사용한다.
  • 대칭 세션 키 생성 방법으로는 디피-헬먼 키 교환이 있다.

전방향 안정성

  • 대칭 암호 세션 키를 실제 통신에 사용하면, 키 유출 시 모든 메시지를 읽을 수 있다는 문제가 있다.
  • 이를 피하기 위해 각 메시지마다 세션 키를 새로 만드는 전방향 안정성 암호화를 사용한다.
  • 그래서 키를 알아내도 메시지를 하나 밖에 못푼다.

암호학적 해시 함수

  • 모든 해시 함수를 사용할 수는 없고 몇몇 특성을 지닌 함수만 암호학적 해시 함수로 쓸 수 있다.
  • 암호학적 해시 함수의 핵심 특성은 모두 단방향 함수라는 것이다.
  • 또한 차이가 조금 있는 여러 입력 데이터에 해시 함수를 적용해 만든 해시값들은 서로 연관 관계가 없어야 한다.
  • 그래서 비슷한 값들에 대한 유추가 어렵다.
  • 즉 해시 충돌을 만들어내기가 어려워야 한다는 것이다.

디지털 서명

  • 데이터가 진본임을 검증한다.
  • 정합성, 부인방지, 인증을 제공한다.
  • 정합성 검증은 메시지가 변조됐는지를 검증한다.
  • 데이터의 암호학적 해시 값을 데이터 뒤에 추가하고, 이때 해시를 자신의 비밀키로 암호화해 메시지 뒤에 덧붙인다.
  • 서명의 경우는 공개키와 비밀키 역할이 반대다.
  • 부인방지는 메시지를 보낸 사람이 자신이 보낸 적이 없다고 주장할 수 없다는 것이다.
  • 비밀키로 메시지에 서명하기 때문이다.
  • 수신자는 메시지에 서명한 사람을 확신할 수 있고, 해시값으로부터 변조 여부를 확인할 수 있다.
  • 그래서 수신자가 받은 메시지가 원본과 동일하다는 사실을 확인(인증)할 수 있는 것이다.

공개키 인프라

  • 공개키가 신뢰할 수 있는 것인지 알기 위해 공개키 인프라스트럭처(PKI)를 사용한다.
  • 신뢰할 수 있는 인증기관에서 키가 어떤 당사자의 것인지 인증해준다.
  • 인증기관이 인증기관의 키로 서명된 인증서를 발행한다.
  • 물론 인증기관도 만능은 아니라 신뢰 문제가 발생할 수도 있다.

블록체인

  • 크립토그래피를 응용한 분야다.
  • 데이터를 기록하는 레코드가 있고 이를 블록이라 한다.
  • 새 블록을 만들 때는 이전 블록에 대한 암호학적 해시와 블록 생성 시간을 추가한다.
  • 이렇게 연결된 블록의 체인이 생긴다.
  • 블록을 변경하면 해시가 변경되어 다른 블록에 저장된 해시와 일치하지 않게 된다.

패스워드 관리

  • 예전에는 패스워드를 평문 그대로 저장했지만, 이제는 암호화해서 저장한다.

보안을 위한 소프트웨어 예방 조치

올바른 대상을 보호하라

  • 모든 대상을 안전하게 할 필요 없이 안전해야만 하는 대상만 안전하게 하면 된다.
  • 안전할 필요가 없는 대상을 안전한 대상에 접근할 수 있는 사용자와 그렇지 않은 사용자가 모두 볼 수 있다.
  • 그렇지 않은 사용자가 안전한 대상에 접근할 가능성이 커진다.

로직은 세 번 체크하라

  • 로직에 오류가 있으면 공격당할 가능성이 높기 때문에 코드를 보고 또 보자

오류를 검사하라

  • 오류와 경고 보고를 항상 활성화 하고 무시하지 말고 확인하자

공격 표면을 최소화하라

  • 기능이 많을수록 그만큼 공격 표면이 많아진다.
  • 코드를 가능한 간단하게 유지해 공격 표면을 줄이자

경계 내부에 머물러라

  • 가정하지 말고 경계 내부에 머물 수 있게 주의하자
  • 데이터의 경계 내부도 중요하지만 메모리 경계 내부에 머무는 것도 중요하다.
  • 타이밍 경계도 주의하자
  • 이러한 경계 버그를 잡을 때 도움이 되는 퍼징이라는 테스트 기법이 있다.

좋은 난수를 생성하기는 힘들다

  • 크립토그래피에는 좋은 난수가 중요하지만 생성하기 힘들다.
  • 가장 흔히 의사 난수 생성이 많이 쓰인다.
  • 의사 난수는 같은 숫자에서 시작하면 같은 순서로 난수가 생성된다.
  • 최근에는 무작위성을 높이기 위해 여러 가지 대상으로부터 엔트로피를 수집한다.

네 코드를 알라

  • 큰 프로젝트일수록 서드파티 코드가 들어가는 경우가 많다.
  • 제품에 쓰이지 않는 코드가 꽤 많이 제품에 포함되기도 한다.
  • 오픈소스 같은 경우는 코드를 볼 수 있기에 보안상 오히려 더 좋을 수도 있다.
  • 써드파티 패키지에서 실제 사용하는 코드의 크기와 전체 패키지 크기 사이의 비율을 주시하자.
  • 출시 전에는 반드시 디버깅을 위한 코드를 제거하자

극단적인 영리함은 여러분의 적이다

  • 벤더가 사용자가 적어 지원하지 않는 잡다한 기능은 가급적 사용하지 말자

눈에 보이는 것을 이해하라

  • 프로그램 구현의 메타데이터나 부작용을 이용한 사이드 채널 공격을 조심하자
  • 예를 들면 틀린 암호보다 올바른 암호 검사에 시간이 더 걸린다는 점을 이용한 타이밍 공격 같은 것들이 있다.

과다수집하지 마라

  • 가장 안전한 방법은 안전해야 할 대상을 만들지 않는 것이다.
  • 정말 필요한 경우가 아니라면 민감한 정보를 수집하지 말자
  • 생년월일을 알고 있다면 나이를 굳이 수집할 필요가 없는 것처럼

모아두지 마라

동적 메모리 할당은 여러분의 친구가 아니다

  • 동적 메모리 해제 시에는 민감한 정보를 지워야 한다.

가비지 컬렉션도 여러분의 친구가 아니다

코드 역할을 하는 데이터

  • 코드도 결국 컴퓨터가 이해할 수 있는 데이터다.
  • 데이터를 실행하는 프로그램은 코드와 데이터가 분리되어 있지 않고, 보호장치도 없다.
  • SQL 인젝션 같은 대표적인 공격 방법이 있다.
  • HTML의 게시글이나 댓글 같은 곳에 자바스크립트 등을 추가해 악용할 수도 있다.
  • 이러한 부분들을 생각하며 코드를 작성해야 한다.
This post is licensed under CC BY 4.0 by the author.