보통 자바스크립트에서 공개적으로 노출됨으로 보안에 우려가 간다.

그래서 오픈소스 난독화를 뒤지다가 괜찮은 곳을 발견했다.



URL : http://dean.edwards.name/packer/

출처 : http://www.zdnet.co.kr/column/column_view.asp?artice_id=20100805104617&type=det

과연 인터넷 웹 서비스는 안전한가?

일상적으로 접속해 정보를 상호 소통을 하는 중요한 매개체로 자리잡은 웹서비스는 그만큼의 신뢰도를 가지고 있다고 할 수 있을까?

여기 보려 하지 않고 외면 하고자 하는 불편한 진실이 있다. 이미 오래된 이야기지만 지금까지도 진행형 이고 앞으로도 심각성이 더 높아 질 수 밖에 없는 불편한 진실이다. 아직도 많은 이들의 관심 밖에서 이뤄지는 현실이 여기있다.

안전한 웹 서비스로 가는 길은 멀고도 험하다. 그러나 대부분이 쉽게 생각한다. 공격자들은 항상 그 빈틈을 노리고 끊임없이 공격한다. 일반 인터넷 사용자들은 자신의 아이디와 패스워드가 노출 되어 금전적인 손실이 발생 하거나 피해를 입었을 경우에만 민감하게 반응한다.

개인 PC에 설치된 악성코드의 문제를 개인 사용자의 부주의로 돌리는 것은 잘못된 것이다. 이제는 기본적인 보안 대책을 철저하게 실천한다해도 악성코드로부터 안전하지 않다.

어떤 접속 도구를 이용하던 웹 서핑을 하면서 자료를 확인 하고 정보를 공유하는 지금의 시대에 안전한 상태로 개인 PC를 유지 하려면 인터넷을 하지 말아야하는 수준이다. 사용자PC의 안전한 설정은 가능성을 조금 줄이는 옵션일 뿐이다.

왜 이런 상황까지 전개가 된 것일까?

일단 기본 설명에 대한 이해를 참고 하도록 한다.

대규모(Mass) SQL 인젝션(Injection)에 관련된 설명은 다음을 참고 한다.
Mass sql injection 대응과 현실 - http://p4ssion.com/200
SQL Injection 공격 변화 - http://p4ssion.com/207

본시 SQL 인젝션 공격은 2005년 무렵부터 자동화된 도구를 이용하여 처음 시작이 되었다. 이전에는 공격자의 수작업에 의한 소위 타켓팅한 공격만이 있었다. 자동화된 도구에 의한 공격은 한국이 최초의 테스트 베드가 됐고 그 시작은 2005년부터다.

자동화된 도구를 이용한 SQL 인젝션 공격은 2007년을 지나면서 다른 양상으로 전개 되기 시작한다. 단일 사이트에 대한 자동화된 공격을 벗어나 대규모 도메인에 대한 자동화된 공격으로 전이가 된 것이다. 차이점은 자동화된 공격 도구의 대상을 단일 도메인으로 지정하는 것이 아니라 대규모 도메인 혹은 구글과 같은 검색엔진을 통한 무차별적인 공격으로 방향을 전환 했다는 점이다.

단일 서비스에 대한 공격으로 한정이 될 때는 공격자도 그만큼 많은 노력을 기울여서 여러 사이트를 반복해서 공격 할 수 밖에 없었지만 수집된 도메인 리스트에 기반한 공격과 검색엔진을 동원한 공격은 국가와 지역의 차이를 넘어서 무차별적인 서비스 공격으로 나타나고 있다.

서비스를 공격한 후에는 웹 서비스에 악성코드를 유포하는 URL을 삽입한다. 물론 데이터베이스안에 있는 내용은 관심 밖이다. 이미 가져갈 만큼 다 가져 갔는데 또 가져갈 필요성이 있을까? 이젠 데이터베이스에 저장된 내용이 아닌 방문자의 정보가 필요할 뿐이다.

웹 사이트 방문자의 PC에는 웹 사이트에 방문 할 때 마다 악성코드가 다운로드가 되고 조금 신경을 쓰면 방문자의 PC 운영체제에 따른 공격이 발생되게 된다.

이제 개인 사용자가 금융거래 사이트 또는 인터넷 서비스에 접근 할 때 마다 사용자가 입력하는 키입력 정보는 공격자에게로 전송된다. 때론 봇넷 에이전트를 동원해 분산서비스거부(DDoS) 공격을 하기도 하고 협박을 하기도 한다. 공격자들은 유출된 개인정보를 이용해 블로그나 카페, SNS 매체에 광고를 하는 등 다양한 방식으로 금전적인 이득도 추구하고 있다.

국내 금융권의 경우 다단계 보호수단들이 있으나 해외 금융기관들은 보호수단이 없거나 미비한 경우가 많아 피해 금액이나 사례는 국내보다 해외에서 더 큰 문제로 대두되고 있다.

현재의 대규모 SQL 인젝션 공격 동향을 살펴보면 두 가지 유형을 살펴 볼 수 있다. 좀 더 세밀하게 다듬어진 공격과 무차별적인 공격으로 구분 할 수 있는데 그 특징은 다음과 같다.

1. 웹 서비스의 소스를 일부 수정한다. *.js 와 같은 스크립트 유형의 코드를 웹 서비스 소스에 심어 두고 웹 사이트 방문자가 방문 할 때 마다 해당코드가 자동으로 실행 되도록 한다. 스크립트 코드에는 원격에서 사용자의 PC의 권한을 획득하기 위해 악성코드들이 다운로드 되고 실행이 된다.

2. 무차별 공격은 DB 테이블에 악성코드를 다운로드 하는 스크립트를 무작위로 삽입 하는 방식으로 이루어진다. 이 경우 전체적인 공격현황이 검색을 통해 손쉽게 드러난다. 그러나 공격자의 개입 없이도 자동적인 실행과 반복이 가능함으로 대규모 피해가 수반되고 있다. 2와 같은 경우는 많은 웹 서비스들이 데이터베이스에 들어 있는 콘텐츠를 일반 텍스트가 아닌 HTML로 화면상에 전환해 뿌려줌에 따라 자동적으로 실행된다. 텍스트로 읽어 들이는 경우에는 방문자 PC에 있는 브라우저 상에 스크립트 코드 링크들이 중간중간 삽입된 형태로 깨어지는 것을 확인 할 수 있다.

1번과 같은 세밀한 방식은 안티 바이러스 솔루션을 통해서 공격감지가 가능하다. 단 제로데이 공격이 아닐 경우에만 탐지가 가능한 경우다. 하루가 다르게 수많은 애플리케이션에서 취약성이 발견되는 현재에는 탐지 되지 않는 경우가 점차 증가 할 수 밖에 없다. 2번의 경우는 관리자가 손쉽게 데이터베이스 변조 여부를 확인 할 수 있으나 데이터 복구에 시간이 걸리는 문제들이 발견 되고 있다.

현상적으로 발견 할 수 있는 SQL인젝션 공격의 폐해는 무차별적인 공격의 경우 간략하게 검색엔진을 통해서 확인 할 수 있다. 최근까지 발견된 악성코드 유포 링크를 기준으로 검색한 결과는 상상 이상의 웹 서비스들이 해킹을 당하고 악성코드 유포에 이용이 되고 있음을 확인 할 수 있다.

22dnf.com/ff/y.js (국내용) 31,200개
www.dbrgf.ru/script.js (국내외용) 2,810개
mysy8.com/1/1.js (국내용)
s.ardoshanghai.com/s.js (국내용) 1,840,000개
sion.or.kr/iis.swf (국내용) 253,000개
bq346.cn (국내용) 4,930개
mekiller.com/1/1.js (국내외용) 27,500개
*.postfolkovs.ru/js.js (국외용) 125,000개
4589.in/yahoo.js (국외용) 254,000개
s.lbs66.cn/kr.js (국내용) 262,000개
s1.cawjb.com/s.js (국외용) 2,030,000개
s1.cawjb.com/kr.js (국내용) 950,000개
www.adst.ru/ads.js (국외용) 2,280,000개
www.24aspx.com/script.js (국외용) 12,400개
www.dnf666.net/u.js 전체: 530,000 / 국내: 463,000
www.adw95.com/b.js 전체: 61,200 / 국내: 3,940
www.nihao112.com/m.js 전체: 22,000 / 국내: 6
www.update34.com/b.js 전체: 16,500 / 국내: 6
기준 검색 일시: 2010. 7.1

*감염수치는 근사치로 활용이 되어야 하고 각 검색 시점에 따라 다를 수 있다. 또한 수치 확인에는 검색엔진의 검색결과를 이용 하였으므로 중복된 결과도 일부 존재 할 수 있다. 그러나 대강의 상황을 유추 할 수 있다는 점에 있어서 충분한 인용가치는 있다고 본다.

현재 검색 할 경우에는 차이가 많음을 확인 할 수 있다. 그러나 수치 차이는 검색엔진에서의 필터링과 대응을 통해 조회 시점의 수치보다 낮아 질 수 밖에 없다. 악성코드 유포 링크들이 여전히 일부 서비스들에 남아 있다는 것은 문제가 발생 된 이후에도 전혀 수정이 안되었음을 의미한다. 많은 서비스들이 공격이 가능했던 근본적인 소스코드 수정은 하지 않고 추가된 악성코드 유포 링크의 제거에만 신경을 쓰고 있는 것이 현실이다. 새로운 SQL 인젝션 패턴이 발생 될 경우에는 또 다시 몇 백 만대의 서비스들에서 악성코드를 유포하는 현황을 앞으로도 손쉽게 살필 수 있을 것이다.

악성코드를 유포하는 링크들의 업데이트 현황 중 일부는 여기에서 (http://securedmz.com/reference.php) 확인이 가능하다. 이 링크도 일부분임을 기억하자. 공격자 몇 명에 의해 생성되는 링크일 뿐이다. 실제 규모는 휠씬 더 심각한 상황 일 수 밖에 없다. 드러난 것은 10% 미만이라고 본다. 또한 검색엔진에 나타나지 않는 세밀한 공격은 통계치의 밖에 있다.

화면 상에 보듯이 검색결과의 차이가 상당함을 볼 수가 있다. 가장 최근에 보고가 된 Mass SQL Injection 공격으로 삽입된 악성코드 링크는 b.js를 포함하는 링크이다. 검색 결과는 다음과 같다.

2010년 8월 현재 152만개의 서비스에서 악성코드 유포 흔적들이 있다고 나타나고 있다. 그러나 이 중에는 정확한 분석 또는 단순 질의도 포함이 되어 있을 수 있다. 그러나 1/3만 유효한 링크라고 잡아도 50만대의 웹서비스에서 악성코드를 유포하는 것이다.

하루 방문자를 최소화 한다고 하여도 50만대의 웹 서비스에 최소 5명씩만 방문 한다고 하여도 250만대의 PC가 (실제는 휠씬 더 많을 수 밖에 없다.) 영향을 받는 것이다. 공격 성공률은 제로데이 (패치가 나오지 않은 공격) 공격일 경우 매우 높을 것임은 명확하다.

단순한 일회성의 공격이 아니다. 공격자들은 새로운 공격코드를 몇 십 만대에 또 다시 넣을 필요 없이 단순하게 악성코드를 다운로드 받는 주소에 있는 악성코드만을 새로운 것으로 바꿈으로 영향력을 가지게 된다.

전 세계의 보안 관련된 회사들을 단지 2~3명 정도의 공격자가 손쉽게 농락 할 수 있는 상황이 된 것이다.

공격방법 및 활용 시나리오를 간략하게 요약하자.

1. 악성코드를 유포할 숙주 도메인을 확보한다. 가급적 여러 개의 도메인을 확보. 위의 예에서는 b.js 파일이 올려진 사이트가 되겠다.

2. 검색엔진 및 리스트를 통해 Mass Sql Injection 공격을 자동으로 진행 하도록 하고 공격 성공 시에는 악성코드 유포 주소를 삽입한다. (소스코드에 링크 추가 또는 데이터베이스 테이블 내용 변경)

3. 이제 웹서비스를 통해 유포되는 악성코드들이 웹서비스 방문자의 PC에 설치 되기만 기다리면 된다.
4. 사용자들은 웹브라우저를 통해 웹사이트에 접근 하는 것 만으로도 악성코드가 다운로드 되고 실행 될 수 있는 환경이 된다. 이후 키입력은 모두 유출되고 PC는 좀비 PC가 된다.

만약 백신 개발업체에서 대응 백신을 개발한다면 공격자들은 초기 b.js 안에 실행되거나 다운로드 되는 악성코드를 변경 한다.

새로운 취약성이 있다면 즉시 활용을 하게 된다. 평균 신규 취약성이 나온 이후 며칠이 걸리던 것에서 이젠 12시간 이내에 새로운 악성코드로 전환 되는 것을 확인 할 수 있다. 개인 사용자가 사용하는 백신이 업데이트 된다 하여도 웹 서비스에 들어 있는 악성코드 링크가 사라지지 않는다면 최소 12시간 이내에 또 다른 공격을 맞이 하게 된다는 이야기 이다.

싸움은 더 이상 신사의 싸움이 아니며 공개적인 영역까지 침범을 당하고 대응하기 어려운 상태에 빠져 있다. 공격은 광범위하고 폭넓게 퍼져 있다. 현재는 asp, aspx + Ms sql 에 대한 대규모 공격도구가 활성화된 상태이지만 다른 개발언어와 데이터베이스를 향한 도구도 이미 일반적이다. 대규모로 확산 되는 것은 시간 문제일 따름이다.

현실은 앞에서 언급 했듯이 엄중한 현실이나 대책은 현실적으로 역부족일 수 밖에 없다. 공격을 당하지 않기 위해 웹 서비스 단위에서 진행 되거나 할 수 있는 대책은 크게 4가지 정도로 볼 수 있다.

웹 방화벽과 소스코드 검사, 모의해킹, 웹 스캐너 도입을 통한 문제점 해결 과 같은 유형이며 개인 사용자를 위한 대책은 오로지 바이러스 백신 외에는 없는 현실이다. 각 대책 별 문제와 이슈는 간략하게 다음과 같다.

각 대책 별 문제

전제: 웹 서비스는 잦은 사이트 개편과 갱신이 수시로 발생된다 이 모든 과정에서 보안적인 위험을 걸러낼 수 있어야 하나 현재 보안전문인력을 운영하고 상시적인 검사 프로세스를 갖춘 곳은 국내의 1% 미만의 업체만이 가능한 상태이다. 그 업체의 경우에도 전체 사이트 문제를 수시로 체크 할 수는 없는 상태이며 6개월 혹은 1년 단위로 전체 서비스를 검사하는 정기검진의 형태로만 진행 한다. 웹서비스의 잦은 개편과 갱신을 절대로 따라 갈 수 없는 상태가 된다.

1. 웹 방화벽: 우회 공격에 취약하며 근본 문제 해결이 아님. 비용 및 관리의 문제 발생

2. 소스코드 검사: 시일이 오래 걸리며 전문적인 인력이나 전문업체의 도움을 받아야 됨. 비용과 시간의 문제가 발생됨.

3. 모의해킹: 모의해킹을 통해서는 모든 문제가 발견 되는 것이 아니라 해당 사이트의 권한 획득만을 한 이후 종료 되는 과정이 대부분임. 이후 수정에 대한 피드백 제공 불확실. 비용의 문제 존재

4. 웹스캐너 도입: 상대적으로 고가의 솔루션이며 전문적인 결과가 도출 됨으로 인해 스캐너 결과를 이해 할 수 있는 인력의 도입이 필요하며 스캐너 비용 자체도 외산과 국산 모두 고가의 가격으로 도입에는 부담이 있음. 더불어 즉시적인 검사가 어려움 (개발속도 보다 진단 속도가 늦는 경우가 다수 발생)

이제 대책은 전 세계의 웹 서비스 개발 프로그래머를 일정 수준 이상으로 끌어 올리고 상시적인 점검이 가능한 체계를 어디에서 먼저 구축하느냐에 따라 달려 있다. 상당히 먼 길이 될 것이다. 앞으로의 현실은 오래 전 예상 했던 대로 상상 그 이상의 현실을 보게 될 것이다.

(필자 트위터 주소: http://twitter.com/p4ssion, 블로그: http://p4ssion.com)


-- 데이터베이스 마스터 키 생성

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '암호'
GO

-- 마스터키로 부터 비대칭 키 생성
CREATE ASYMMETRIC KEY ASYM_ENCRYPTION_TEST WITH ALGORITHM = RSA_1024
GO

-- 데이터 암호화에 사용되는 대칭 키 생성
CREATE SYMMETRIC KEY SYM_ENCRYPTION_TEST WITH ALGORITHM = DES
ENCRYPTION BY ASYMMETRIC KEY ASYM_ENCRYPTION_TEST
GO

-- 대칭키 열기
OPEN SYMMETRIC KEY SYM_ENCRYPTION_TEST DECRYPTION BY ASYMMETRIC KEY ASYM_ENCRYPTION_TEST

-- 대칭키의 GUID를 열고 데이터 암호화
DECLARE @GUID UNIQUEIDENTIFIER
SET @GUID = (SELECT KEY_GUID FROM SYS.SYMMETRIC_KEYS WHERE NAME='SYM_ENCRYPTION_TEST')

SELECT '1111-2222-3333-4444' as 원본, EncryptByKey(@GUID, '1111-2222-3333-4444') as 암호화

-- 복호화 테스트
SELECT CAST(DecryptByKey(EncryptByKey(@GUID, '1111-2222-3333-4444')) as VARCHAR(20)) as 복호화

+ Recent posts