정보실

웹학교

정보실

php 시편으로 PHP 보안 취약점 탐지

본문

보안 취약점은 종종 수동으로 찾기가 매우 어렵습니다. 널 포인터 오류는 매우 빠르게 알려질 수 있지만 심각한 취약점이 있음을 인식하지 않고 10 년 동안 코드를 실행할 수 있습니다.


https://psalm.dev/articles/detect-security-vulnerabilities-with-psalm 


그러나 정적 유형 검사를 통해 개발자가 코드에서 버그를 찾는 데 도움이 되는 것처럼, 오염 분석이라는 기술을 통해 많은 보안 취약점을 정적으로 발견 할 수도 있습니다.


오염 분석은 사용자 제어 입력 (예 : $ _GET [ 'name'])과 이스케이프 처리되지 않은 사용자 제어 입력을 원하지 않는 장소 (<h1> <? = $ name?> < / h1>)하여 데이터가 애플리케이션을 통해 어떻게 흐르는 지 검토합니다.


PHP에 대한 오염 분석을 수행하는 몇 가지 상용 도구가 있습니다. 우리는 2 년 전에 Vimeo에서 한 가지를 시도했지만 실제로 보고 된 문제가 없었기 때문에 결과는 실망스러웠습니다.

이 도구는 올바른 종류의 항목 (SQL 삽입, 사이트 간 스크립팅 취약점 등)을 찾고 있었지만, 많은 거짓 양성은 시편이 상당히 좋은 유형 유추의 결과였습니다.


작년에 시편의 오염 분석 엔진 작업을 시작하여 Vimeo의 코드베이스 (거의 엄청나게 많은 악용 가능한 취약점 수를 발견 한 기능)에 대한 기능을 시험해 보았으므로 이제 다른 모든 사람이 사용할 수 있습니다.


다음은 발견되는 취약점의 예입니다.


사이트 간 스크립팅 (XSS) 


<?php // --taint-analysis


function getName() : string {

    return $_GET['name'] ?? 'unknown';

}


function sayHello() : string {

    return 'Hello ' . getName();

}

?>

<!-- wrap call in htmlentities() to fix -->

<h1><?= sayHello() ?></h1>


SQL injection 


<?php // --taint-analysis


/** @psalm-immutable */

class User {

    public $id;

    public function __construct($userId) {

        $this->id = $userId;

    }

}


class UserUpdater {

    public static function deleteUser(PDO $pdo, User $user) : void {

        $pdo->exec("delete from users where user_id = " . $user->id);

    }

}


$userObj = new User($_GET["user_id"]);


// remove the next line to fix issue

UserUpdater::deleteUser(new PDO(), $userObj);


어떻게 작동합니까? 


--taint-analysis를 사용하여 Psalm을 실행하면 할당, 속성 / 배열 액세스, 함수 호출 등으로 인해 응용 프로그램에서 데이터 흐름 그래프가 천천히 생성됩니다.


모든 잠재적 연결을 매핑 한 후에 시편은 사용자 제어 입력과 echo과 같은 명령문 사이의 문제가 있는 경로를 식별하려고 시도합니다.


Taint sources 


오염 분석에서 사용자 제어 입력을 오염 소스라고 합니다.


소스 예 :


  • $_GET
  • $_POST
  • $_COOKIE

주석 및 / 또는 시편 플러그인을 사용하여 고유 한 오염 소스를 정의 할 수도 있습니다.


Taint sinks 


오염 된 데이터를 원하지 않는 곳이 있습니다.이 장소를 오염 싱크라고 합니다.


싱크 예 :

  • <div id="section_<?= $id ?>">
  • $pdo->exec("select * from users where name='" . $name . "'");
  • header('Location: ' . $location);


위와 같이 시편 주석으로 자신의 오염 싱크를 정의 할 수 있습니다.


구성 키 


시편의 정기적 인 버그 감지 모드는 가솔린 탱크가 가득한 화려하지 않은 자동차와 유사합니다. 도로가 잘 정비되어있는 한 A에서 B로 갈 수 있습니다.


반면에 시편의 보안 분석은 절반의 휘발유 탱크를 갖춘 오프로드 차량과 같습니다. 그것은 약간의 추가 연료 (주석의 형태와 필요한 경우 플러그인 코드). 노력을 기울이면 실제로 유용한 결과를 얻게 될 것입니다.


거짓 양성을 피하는 방법을 포함하여 시편의 오염 분석에 대해 더 자세히 알고 싶다면 문서에서 더 읽어보십시오!



페이지 정보

조회 21회 ]  작성일20-06-26 14:45

웹학교