Seize the day

POST : SDP for win32/빌드,배포 자동화

자동 업데이트시 새로운 셋업 파일의 유효성 체크하기

얼마전에 웹마 사이트에 악성코드가 업로드되어서, 자동 업데이트를 통해서 악성코드가 배포된 적이 있었다.  빠른 대처로 몇 시간 이내에 문제를 수정하기는 했지만 당황하고 아찔했던 순간이었다. 실제로 정확히 기억은 안 나지만 SK컴즈랑 농협에서 비슷한 방법으로 큰 문제가 되었다. 자동 업데이트시 서버 파일의 유효성을 어떻게 체크하는지 살펴보겠다.

 

첫째 도메인의 유효성 검증..

요즘 악성코드는  etc/hosts 파일을 건드려서 도메인이 정확하더라도 업데이트 서버를 변조할 수 있다.  이런 경우 https 를 통해서 서버에 접속하면 되고, SSL 인증서를 확인하는 방법으로 서버 검증이 가능한데... 파일 업데이트를 위해서 별도의 HTTPS 서버를 두어야 한다니,, 굳이 이렇게 까지 할 필요는 없을듯 하다. 또한 정상적인 서버라도 악성코드를 업로드해 둘 수도 있기에 완벽하지 않다.

 

두번째,

 EXE, DLL 파일의 코드사인 인증서를 체크한다. 간단한 유틸함수로 코드사인된 파일에서 회사이름 등 정보를 얻을 수 있고, 그것으로 확인이 가능하다. 하지만 단순히 이름만 확인 하는 것은 문제가 있는데 테스트 인증서를 만들어서 동일한 이름으로 코드사인해도 이것을 구별할 수가 없다.  인증서가 진짜로 유효한지 네트웍을 타고가서 인증기관을 통해서 확인하는 Win32 API가 있는데 이 API는 가끔 네트웍 리소스를 장기간 사용할 수도 있는 문제가 있다. 그리고 코드사인 인증서를 구입하기에 애매한 개인 개발자는 사용할 수 없다.

 

세번째,

새로운 업데이터 파일의 해시(Hash)값을 체크하는 것이다. 가장 적용이 쉽고 효과도 탁월하다. 해시로 가장 범용적으로 쓰이는 것이 MD5이나  SHA256을 권장한다. 그런데 여기서 한 가지 주의할 점이 있다. 파일을 단순 해시를 하게 되면 해커에 의해서 악성코드를 동일한 해시알고리즘으로 유효한 해시값을 만들어 낼 수 있다는 점이다. 이러면 해시값을 체크하는 것이 의미가 없어진다. 이것을 방지하기 위해서 해시값을 계산하기 전에 공개되지 않은 비밀 SALT 값을 초기값으로 해시를 계산하게 하면 정상적인 프로그램만이 이를 검증할 수 있게 된다.

 

 

적용 샘플

 

빌드가 성공하면 파일 두개가 생성되는데

LT2Setup.exe

version.ini

 

version.ini의 내용은 아래처럼  versionHash와 setupHash를 가진다.

versionHash는 버전값인 "2,3,0,83"에 대한 해시로 version.ini를 통해서  새 버전으로 인식하더라도 versionHash값이 유효하지 않으면 업데이트 체크를 더 이상 수행하지 않는 기능을 한다.

sertupHash는 LT2Setup.exe의 해시값으로 이 파일을 내려받아서 실행하기전에 setupHash를 통해서 파일의 유효성을 확인하게 된다.

[version]
version=2,3,0,83
setup=http://mdiwebma.com/lt2/LT2Setup.exe
url=http://mdiwebma.com/webma2/board/?id=12
date=2014-07-01
text=
versionHash=53F8A2F63BEFE66652921129988A65C6C2153047F2D1CC153EF660C4A95AB17D
setupHash=49475C874D07C294F9F54D136859CDE0EC9C8AA0538BD5302CF60888F58BC0C2

 

 

해시생성 자동화

빌드 과정에서 해시값은 자동으로 생성이 된다.  iv값은 어플과 공유하는 값으로 이 값이 달라지면 동일한 파일도 해시값이 달라진다. (여기에 예시된 iv는 샘플이다.)

call _version.bat
if exist version.ini del version.ini
set LT2_VERSION=%LT2_VERSION:.=,%

 

@echo:[version] > version.ini
@echo:version=%LT2_VERSION% >> version.ini
@echo:setup=http://mdiwebma.com/lt2/LT2Setup.exe >> version.ini
@echo:url=http://mdiwebma.com/webma2/board/?id=12 >> version.ini
@echo:date=%date% >> version.ini
@echo:text= >> version.ini

 

dfx_makehash.exe /iv=private_key /ini=version.ini /sec=version /name=versionHash /targetName=version
if not "%ERRORLEVEL%" == "0" goto ERROR

 

dfx_makehash.exe /iv=private_key /ini=version.ini /sec=version /name=setupHash /targetFile=..\deploy\LT2Setup.exe
if not "%ERRORLEVEL%" == "0" goto ERROR

 

프로그램에서 셋업파일 해시 체크

   DeleteUrlCacheEntry(url);
   if( _URLDownloadToTempFile( url, szTemp, cch, hProgress))
   {
      // 서버 version.ini 파일의 유효성을 체크한다.
      BYTE iv[32] = { NULL };
      Sha256(BYTEPTR(hashSalt_), BYTELEN(hashSalt_), iv);

 

      BYTE hash[32] = { NULL };
      Sha256File(szTemp, hash, iv, sizeof(iv));
      CAtlString hashStr = BinToHexText(hash, sizeof(hash));
     

 

이 방식의 좋은 점은 내가 사용하는 프로그램이,  배포 사이트가 해킹을 당하더라도 새 버전이 정상적인 버전 업데이트라는 것을 보증하며, 내려받아 실행하는 셋업 파일이 악성코드가 아니라는 것을 보증한다는 점이다.

 

 

 

top

posted at

2014. 7. 1. 22:05


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크