php_screw
php_screwim https://github.com/OOPS-ORG-PHP/mod_screwim
이 둘은 php코드를 암호화하여 저장하고 별도로 컴파일한 모듈을 로드해
소스를 보지는 못하지만 실행만 가능하게 하는 php모듈이다.
php_screw.so 모듈과 암호화된 php파일을 입수하면 물론 리버스엔지니어링을 통해 Key을 알아내서 복호화 할 수 있지만 그래도 복잡한 작업이다.
따라서 설정파일 등을 암호화해서 저장해놓고 screw 모듈을 올려놓으면 web shell등에 대해서는 어느정도 보안성이 증가한다.
하지만 screw을 php소스 배포용으로 사용하는것은 부적절하다.
1. screw을 자기만의 key으로 컴파일한다.
2. 컴파일한 screw을 통해 php소스를 암호화한다.
3. 암호화된 php코드와 php_screw.so 모듈을 배포한다.
(보안성 향상을 위한답시고 php_screw.so 모듈을 난독화해서 배포하든말든...)
이러한 상황에서는 100% 소스코드가 그대로 노출될 수 있다.
screw는 zend_compile_file 함수를 Hooking해서 screw로 암호화된 파일은 screw모듈에서 복호화하는 작업 후
원래의 zend_compile_file 을 실행한다.
시스템관리자 권한이 없는 사람은 screw.so을 리버스엔지니어링 해서 key을 알아내야 하지만
배포된 php파일을 사용하는, 시스템관리자 권한을 가진 사람은 key을 알아내지 않고도 php파일을 복호화 할 수 있다.
screw에서 zend_compile_file을 hooking한 것처럼
screw전에 먼저 zend_compile_file을 hooking하면 screw가 복호화한 소스를 볼 수 있다.
아래는 screw으로 암호화된 파일을 /tmp/파일이름.dec으로 자동 저장하는 모듈이다.
https://github.com/jc-lab/php_screwhook
이 모듈을 빌드하고 screw보다 먼저 extension하면 복호화된 소스를 자동으로 저장할 수 있다.
암호화된 php소스를 배포하려면 난독화하거나 Zend guard을 사용하거나(하지만 이것도 뚫렸다더라... 최신버전은 어떨지 모르겠지만..)
그냥 속편하게 OpenSource으로 배포해야....^^
댓글