Security

업데이트 배포서버가 해킹된다면? - 1편

robinjoon98 2021. 1. 5. 15:55

개요

자동 업데이트 : 가장 기본적인 구조

우리는, 여러 프로그램을 자동으로 업데이트되게 설정해놓고 사용하고 있다.

이런 프로그램은 기본적으로, 우리가 컴퓨터를 키면, 업데이트를 확인하며, 업데이트가 있으면 자동으로 서버로부터

다운받아 업데이트를 설치한다. 이걸 그림으로 나타낸 것이 바로 위의 그림이다.

아주 암울한 상황을 상상해보자. 악의적인 마음을 품은 해커가 프로그램의 업데이트 배포서버를 해킹했다고 가정하자.

해커가 배포서버의 정상적인 파일을 변조된 파일로 바꿔치기 하면, 각 사용자의 PC는 배포서버에 새로운 업데이트가 배포되었다고 판단하고, 이를 다운받아 PC에 설치할 것이다. 이렇게 되면, 수많은 사용자의 PC가 해커의 손에 들어오게 된다.

자동 업데이트 : 변조탐지 과정 추가

당연히, 모든 자동업데이트를 지원하는 서비스는 이런 경우를 방지하기 위해, 배포서버로부터 다운 받은 파일을 설치하기 전에 이것이 변조되었는지 확인하는 작업을 거친다. 그렇다면, 업데이트 프로그램은 어떻게 배포서버로부터 다운받은 파일이 변조되었는지 확인 할 수 있을까? 이를 이해하기 위해 해쉬와 비대칭키 암호화에 대해 알아보고, 이를 어떻게 조합하여 변조여부를 확인하는지 알아보자.

 

해시

 

해시

해시란, 어떤 입력에 대응되는 정해진 길이의 난수를 반환하는 함수를 말한다. 이떄, 반환되는 난수를 해시값이라 한다.해시함수의 입력값에 제한을 두지 않는 경우, 무한한 입력이 가능하지만, 해시 값은 고정된 길이이므로 유한한 경우의 수를 가진다. 따라서, 다른 입력값이 같은 해시값을 만드는 경우가 무조건 발생하게 된다. 이런 경우를 충돌 이라 한다.

해시 충돌

해시는, 그 탄생목적은 전혀 다른 형태의 데이터들을 같은 형태의 데이터로 매핑하여 비교등의 처리를 더 빠르게 하기 위해 만들어진 것인데, 보안에 활용하는 경우 아래 성질을 만족하는 암호화 해시 함수를 사용한다.

  1. 역상 저항성 : 해시값으로부터 그 해시값을 만드는 입력값을 찾는 것이 현실적으로 불가능하다.
  2. 제 2 역상 저항성 : 입력값을 바꾸면서, 해시값을 그대로 유지시키는 입력값을 찾는 것이 현실적으로 불가능하다.
  3. 충돌 저항성 : 같은 해시값을 만드는 서로 다른 입력값을 찾는 것이 현실적으로 불가능 하다.

이런 성질을 만족하는 암호화 해시는 사실상 아래 그림과 같은 성질을 만족한다고 해도 문제가 없다.

암호화 해시 특징 : 입력이 다르면 해시값도 다르며, 입력이 같으면 해시값도 같다.

따라서, 암호화 해시는 비밀번호저장, 데이터의 무결성 확인등의 작업에 활용할 수 있다.

암호화

암호화 : 평문을 암호문으로 바꾸는 과정. 반대과정은 복호화라 한다.

암호화는 특정 데이터를 타인이 알아보지 못하도록, 변환하는 것을 말한다. 이 때, 암호화되기 전의 데이터를 평문이라 하고, 암호화된 데이터를 암호문이라 하고, 암호를 만드는데 사용한 특정한 값(키)을 암호화 키라 한다. 반대로, 암호문을 평문으로 바꾸는 과정을 복호화라 하고, 이 때 사용된 특정한 값(키)를 복호화 키라 한다.

대칭키 암호화 : 암호화키와 복호화키가 같은 암호화 방식이다.

누구나 생각할 수 있는 가장 간단한 암호화 알고리즘은 각 알파벳을 n개만큼 옆으로 이동시키는 것으로, KID -> MKF 와 같이 변환하는 것이다. 보면 알 수 있듯이, 이 예에서 n은 2이다. 여기서 2가 이 암호화 키가 된다.

이 알고리즘의 경우 암호화키와 복호화키가 같다. 이러한 방식의 암호화를 대칭키 암호화라고 한다.

비대칭키 암호화 : 암호화키와 복호화키가 다른 암호화 방식이다.

반면, 암호화에 쓴 키와 복호화에 쓴 키가 서로 다른 암호화방식은 비대칭키 암호화 라고 한다. 이 경우 두 키 어느 것으로든 암호화 할 수 있고, 암호화에 사용하지 않은 나머지 다른 키를 사용해 복호화 할 수 있다.

비 대칭키 암호화는 공개키 암호화 라고도 불리는데, 두 키중 하나를 공개해 사용자로부터 데이터를 암호화하게 하고, 공개하지 않은 키로 복호화 하는 방식으로 사용하기 때문이다. 실제 양방향 암호화 통신의 경우, 대칭키 암호화 알고리즘의 키를 공개키로 암호화하여 전송하는 방식으로 사용된다. 

코드사인

코드사인 : 변조여부를 판별하기 위한 장치

이제, 개발자 입장에서 업데이트파일의 변조여부를 클라이언트의 업데이트 프로그램이 알 수 있게 하는 방법을 알아보자. 우선, 업데이트할 파일의 해쉬값을 구한다. 이를 H1이라 하자. 이 H1을 개발자의 비밀키(KeyE)로 암호화한다. 이 과정을 서명이라 한다. 이 때, 서명을 S라 하자. 개발자는 원본파일과 S, KeyD(복호화키,공개키)를 합쳐서 배포용 파일인 C를 만든다. 

변조 확인 : H1과 H2가 다르면 파일이 변조된거다.

업데이트 프로그램은 이제, 배포서버로부터 C를 받아오고, 이 C를 원본파일, S, KeyD로 분리한다. 이 후 원본파일의 해쉬값을 구한다(H2). 그리고 S를 KeyD로 복호화하여 H1을 얻는다. 만일, 원본파일이 변조되었다면 H1과 H2는 같지 않을 것이다. 같다면, (사인작업 이후에) 파일이 변조되지 않은 것이다.

 

이렇게만 하면, 안전하게 자동업데이트를 구현할 수 있다..? 가 아니다. 아직도 허점은 남아있다. 위에서 내린 결론에 사인작업 이후에 파일이 변조되지 않은 것이라고 했다. 사인작업 이전에 파일이 변조되었는지는 확인할 수 없다.

즉, 해커가 파일을 변조한 후 직접 공개키,비밀키를 만들어 사인을 하면, 업데이트 프로그램은 파일이 변조되지 않았다고 판단, 변조된 파일을 사용자의 PC에 설치하게 된다. 이를 막기 위해 또하나의 수단이 필요한데, 이는 다음 포스팅에서 정리하겠다.

'Security' 카테고리의 다른 글

[Auth] 세션과 토큰  (0) 2021.11.15
업데이트 배포서버가 해킹된다면? - 2편  (0) 2021.01.11
CSRF 실습  (0) 2020.09.23
XSS  (0) 2020.07.19