카테고리 Archives: linux

CVE-2015-0204 취약점 – FREAK Attack

개요
-프랑스 국립 연구소(INRIA) 및 MS社에서는 SSL을 통해 강제로 취약한 RSA로 다운 그레이드 시킬 수 있는 취약점을 발견
※ CVE-2015-0204 : OpenSSL s3_clnt.c의 ssl3_get_key exchange 함수에서 발생하는 취약점으로 공격자가 MITM(Man In The Middle Attack)을 통해 512비트 RSA로 다운 그레이드 시켜 정보를 유출시킬 수 있는 취약점

해당 시스템
-영향을 받는 시스템
-Openssl 0.9.8 대 0.9.8zd 이전 버전
-Openssl 1.0.0 대 1.0.0p 이전 버전
-Openssl 1.0.1 대 1.0.1k 이전 버전

취약점 확인절차
-(시스템 운영자) 시스템 측면 취약점 확인
-아래의 명령어를 입력하여 취약점 유무 확인
-openssl  s_client  -connect  [web site명 입력]:433  -cipher EXPORT

 

1. 정상

2. 취약점 노출 화면 (CERTIFICATE 코드가 보인다.)

 

해결방안
-(시스템 운영자) 해당 취약점에 영향 받는 버전 사용자
-OpenSSL 1.0.2 버전으로 업그레이드(http://www.openssl.org/source/)
-버전 업그레이드가 어려운 경우, OpenSSL ‘RSA_EXPORT Cipher Suites’를 지원하거나 클라이언트로 ‘RSA_EXPORT suite’를 전송할 수 있는 모든 기능을 비활성화 시킬 것을 권장

[참고사이트]
1. http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-0204
2. http://FreakAttack.com
3. https://mozilla.github.io/server-side-tls/ssl-config-generator/

출처 : http://www.krcert.or.kr/kor/data/secNoticeView.jsp?p_bulletin_writing_sequence=22573

————————————————————————————-

여튼 뭐 또 그렇단다 =ㅅ=a..

확인결과 yum update 가 아직 안나왔다.

때문에 extra/httpd-ssl.conf 파일중 SSLCipherSuite!EXPORT 추가를 해서 막는다.

 

ps. 2015 – 03 – 17 추가내용.

음 yum 이 나왔다.

 

설치 이후 체인지 로그에서 fix 가 된것을 확인할 수 있겠다.

 

umount 가 진행되지 않을 경우(device is busy)

umount 명령을 내렸을때

umount : device is busy

라는 에러가 발생하며 umount 가 안될때 사용할 수 있는 방법이다.

 

1. 먼저 해당 디바이스 사용자가 누구인지 확인.

 

2. 해당 마운트 지점을 사용하는 프로세스 kill

 

음~ 추가적으로  원격으로 작업할때는 일반적으로 자신도 user 로 붙어서 사용하기 마련인데.

만약 자신이 로그인한 아이디가 위의 /home 일경우 위 명령어로 프로세스 kill을 시키면

자신의 접속이 끊어지게 되겠다 ‘ㅅ’a

 

자신이 로그인한 계정의 home 디렉토리를 다른쪽으로 옴겨둔뒤에 umount 를 진행하자 ‘ㅅ’a

ps. 계정의 home 디렉토리를 수정하는 명령어.

 

mod_ruid2 의 사용.

mod_ruid2 는 suphp 와 같은 각 계정의 권한으로 실행되게 해주는 DSO 모듈이다.

suphp 는 DSO 가 아니고 apache 1.x 에서 동작하는데 이건 apache2 용이라고 보면 되겠다.

 

http://sourceforge.net/projects/mod-ruid

소스는 소스포지에서 & 설치는 매우 간단하다. ‘ㅅ’a

 

음 그냥 무난하고 설치도 빠르다. 그리고 설정도 간단하다.

 

엔드유져는 웹에서 생성한 파일을 ftp로 직접 수정을 할수 있고

퍼미션 변경등의 행위가 불필요 하기 때문에 매우 편리하다.

심지어 쉬운설치 를 지원하는 XE 혹은 wordpress 의 경우 Ftp 정보 입력없이 플러그인 이나

위젯 설치가 가능한 장점이 있다.

 

이보다 설정이 간단할수는 없지만 함정이 있다.

 

mod_security2 와 권한 문제로 충돌한다. 물론 apache 를 MPM_ITK 로 했을경우에도 충돌한다.

여기서 수 많은 삽질을 해보았다. 모드시큐리티는 해야하기 때문에 ‘ㅅ’a

아파치 8080포트 nginx 80 포트 로 리버스 프로시를 구성해서 nginx 에서 mod_security2 를 돌리고

프록시를 해서 아파치에서 웹서비스를 가동하는 방법 으로 구성은 했었지만 서비스 운용이

불가능하였다 (많은 문제가 있음 : nginx – mod_security2 가 안정적이지 않다.)

apache – apache(프록시)  를 구성해서 해결을 해볼수도 있겠다. 이건 시도하지 않았다.

다만 구성상 가능할것으로 판단 된다.

프록시를 한경우 mod_remoteip (아파치2.4 내장) 모듈로 프록시 되어온 실제 IP를 log로 남기는

작업을 별도로 할수 있다.

 

 

현재 어찌어찌 하여 하나의 아파치2.4 서버에 mod_ruid2 및 mod_security2 를 운영하고 있다.

현재 error_log에 문제가 발생하고 있지는 않지만 좀더 지켜본 뒤 정리해서 업데이트를 하도록 하겠다.

(안정화 테스트중…)

20150216_PicPick_163016

 

2015-11-10 추가 내용: ruid2 사용시 php.ini 의 session.gc_maxlifetime 에 의해 세션이 자동삭제가되지 않는 증상이 확인 되었고 이를 해결하기 위해 명령어를 주기적(cron등록)으로 실행하여 삭제를 합니다.
*- 세션처리를 file 형태가 아닌 memcached 등을 이용한경우 필요가 없음. -*

/tmp  <—— 세션 디렉토리 선언에 따라 변경할것.
-cmin +24  <—— 세션이 만들어진지 24분이 초과 한경우(필요시 변경)

사유: 폴더 안에 약 32000여개 이상의 파일이 만들어질 경우 해당 폴더에 접근하는 시간이 늦어질수 있음
(파티션종류에 따라 틀림) 즉 웹서버 성능저하가 올수 있음. 때문에 필히 필요한 부분 ‘ㅅ’a

쉘 스크립트의 중복실행 방지를 위해 PID 를 생성.

쉘을 단순 명령어 실행 코드로 짤수 있어서 나같은 초보자들도 쉽게 짤수 있는 프로그래밍

언어이도. 또한 서버 관리를 위해 필수 적으로 익혀야 하기도 하고..

 

그러다보니 양산되는 문제가 짜버린 쉘스크립트 코드가 너무 쉽게 만들어져 버리다 보니까.

중복실행이 되면 안되는 쉘스크립트가 중복실행이 되버릴 경우 심하면 서버 다운까지 간다.

예를 들면 백업이라던가.. awstat 체크 로직이라던가. 등등..

그렇다고 while 로 loop 로 너무 많은 쉘을 돌리는것도 문제이긴 하다.

 

그래서 쉘 스크립트를 싱행하기 전에 PID 파일을 생성하고 실행이 되도록 하고.

pid 파일이 있고 현재 프로세스가 실행중이라면 “이미 실행중’ 메세지가 나오도록 하고

pid만 덩그러니 존재 할경우 기존 pid를 삭제하고 실행 되도록 코드를 짜 보았다.

pid 파일은 해당 쉘의 위치와 동일 선상에 생성 되고 삭제되도록 되어 있다 ‘ㅅ’a

 

ps. 2016-07-21 실행된 pid가 너무 짧을 경우 프로세스 exist 체크에서 다른 프로세스를 검출 하는 경우가 나와서 살짝 업데이트를 했습니다.(4째줄..)


ps2. 2020-02-13 기존 스크립트 코드를 단순화 하고 trap 설정을 통해 상단 선언만 되도록 변경 했습니다.(아래)

 

apache 에 mod_security2 를 OWASP 룰셋으로 적용

이건 매우 상급 이니까.  아 해봐야지 하고 덤볐다가는 멘탈 붕괴가 무엇인지 느끼게 해준다 =ㅅ=a

apache web server 에 mod_security를 도입하고 OWASP 룰셋를 적용한다음에 관리하는 방법까지 이다.

먼저 mod_security 를 설치 를 위한 의존성 프로그램 을 설치한다.

그후 다운 로드 및 설치.

그다음 httpd.conf 에 불러오는 설정을 해야 겠지요 ‘ㅅ’a

물론 Include 경로를 자신이 운영하는 웹서버 경로에 바꿔야 하는걸 잊지 말자.

음 mod_security 설치는 되었다.

 

이제 룰셋 적용부분.. http://www.modsecurity.org/rules.html

공식 사이트에서는 아래와 같이 두가지 를 추천하고 있다.

무료 – OWASP ModSecurity Core Rule Set (CRS)
유료 – Commercial Rules from Trustwave SpiderLabs

물론 다른 방화벽 업체에서도 룰셋 제공을 하고 있다.

무료 – Comodo Web Application Firewall (CWAF)

여시서는 OWASP 룰셋을 적용할 예정이다.

OWASP 는 (The Open Web Application Security Project) 오픈소스 웹 애플리케이션 보안 프로젝트 이다 자세한 설명은 http://ko.wikipedia.org/wiki/OWASP 요기서 참조 ‘ㅅ’a

여기까지가 설치 완료는 아니고 사용할 룰셋을 익티베이트 룰셋 폴더에 심볼링 링크를 건다.

이후 owasp-modsecurity-crs 요 폴더를 자신의 httpd.conf 에서 불러 오도록 하면 되겠다.

 

호환성에 염두하지 않고 보안 적인 취약점을 막기 위해 제작된 룰셋이기 때문에

바로 돌리면 사이트가 안뜬다 -_-;;

먼저 php.ini 수정이 필요하다.

 

modsecurity_crs_10_setup.conf 파일에 아래부분을 추가 한다.

SecRuleEngine On -> DetectionOnly 로 설정하면 감시만 하고 실제 차단은 하지 않는다.

다만 이 디텍트모드에서 기존 사이트 운영중인것에서 걸리는 룰셋을 수정 하거나 해제 해야 한다.

httpd.conf 를 수정한다.

위와 같이  SecRuleRemoveById 으로 제거를 할수 있으며 디렉토리 혹은 파일명까지 지정하여 사용할 수 있다.

혹은 아래와 같이 가상호스트에서 특정 호스트만 룰셋(SecRuleEngine Off)적용을 끄거나 특정룰만 제거(SecRuleRemoveById)할 수도 있다.

Ajax 를 사용하는 경우 SecRequestBodyAccess On, SecResponseBodyAccess On 두개의 옵션 때문에

Ajax 가 비정상 동작을 할수 있는데 이것역시 Location 혹은 VirtualHost 에서 각기 Off 가 가능하다.

 

정리 하자면 사용할수 있는것은 아래 4가지 이며.

SecRuleEngine Off
SecRequestBodyAccess Off
SecResponseBodyAccess Off
SecRuleRemoveById 룰셋ID

이 일부 혹은 전체 끄는 옵션을을 VirtualHost 혹은 LocationMatch 안에 넣어 일부 허용만 할 수 있다.

 

아래는 이러한 룰셋을 분석하기 위해 아파치의 error_log 를 분석하기 위한 명령어 이다.

 

모드 시큐리티는 apache / nginx 에 도입이 가능하다.

다만 nginx 는 테스트 결과 룰셋에 걸리는 웹접근이 이루어 질때 메모리 및 CPU 가 과다 사용이 되고

kernel – oom – killer 에 의해 프로세스가 강제 종료되는 사례가 발생하였다.

nginx 에서의 모드시큐리티 사용은 좀더 두고 봐야 할것이라고 생각된다.