사용자의 취약한 Curl 요청 감지 및 차단

4445 단어 securitycurl
Markus SpiskeUnsplash님의 사진

나는 최근에 keep.sh에서 작업하는 동안 매우 흥미롭고 잠재적으로 악용될 수 있는 문제를 발견했습니다.

curl 클라이언트에서 Authorization 헤더가 있는 파일을 업로드하고 이상한 동작을 발견했습니다. 리디렉션 중에 Authorization 헤더는 요청이 다른 도메인으로 리디렉션되더라도 요청과 함께 유지되었습니다.

이것은 명백히 바람직하지 않은 동작이고 가능한 보안 문제였기 때문에 제 관심을 불러일으켰습니다.

빠른 Google 검색으로 CVE-2018-1000007 으로 연결되었습니다.

When asked to send custom headers in its HTTP requests, curl will send that set of headers first to the host in the initial URL but also, if asked to follow redirects and a 30X HTTP response code is returned, to the host mentioned in URL in the Location: response header value.

Sending the same set of headers to subsequent hosts is, in particular, a problem for applications that pass on custom Authorization: headers, as this header often contains privacy-sensitive information or data that could allow others to impersonate the curl-using client's request.

We are not aware of any exploit of this flaw.



이 보안 취약점은 1년 넘게 curl 내에서 패치되었지만 여전히 널리 존재합니다. Homebrew 또는 다른 솔루션을 사용하여 특별히 업데이트하지 않은 경우 오늘 작성하는 시점에서 Curl 7.54를 기본적으로 실행하는 MacBook Pro에 취약점이 여전히 존재합니다.

이 보안 취약점은 우리가 프리미엄 제품에 대한 Authorization 헤더에 의존하기 때문에 우리 서비스에 큰 골칫거리를 야기했습니다. (출시 예정!)

이 취약점은 인증 정보가 제3자 공급자에게 유출되어 고객이 서비스에서 파일을 안전하게 다운로드하지 못하도록 합니다.

당사 서비스에서 파일을 다운로드하면 현재 Digital Ocean 공간으로 리디렉션되는 서명된 URL이 반환됩니다. 이렇게 하면 서버에서 파일을 가져온 다음 사용자에게 전달하는 중개인이 되지 않고도 다운로드를 즉시 시작할 수 있습니다.

이 접근 방식은 요청 속도를 높이고 서버 수요를 줄입니다. 여기에 문제가 있습니다.—'curl 버전이 서명된 리디렉션에 취약한 경우 이 리디렉션 중에 키가 유출될 수 있습니다.

고객이 자신도 모르는 사이에 개인 키가 노출되는 것을 방지하기 위해 이 문제를 해결하는 방법에 대해 내부적으로 많은 논의가 있었습니다.

요청하는 curl 버전을 감지하고 단순히 요청을 차단합니까? 고객이 이 보안 취약점이 있는 curl 버전을 사용하고 경고를 표시하도록 허용합니까? 리디렉션 사용을 포기합니까?

솔루션을 찾는 것을 더욱 어렵게 하기 위해, 이전 버전에 대한 패치가 출시되었기 때문에 단순히 curl 버전을 감지하고 의존할 수 없습니다. 이는 이전 버전의 curl을 사용하는 경우 취약할 수도 있고 그렇지 않을 수도 있음을 의미합니다.

결국 우리는 이 복잡한 문제를 해결하기 위해 창의력을 발휘해야 했습니다. 들어오는 요청에 이 취약점이 있는지 감지한 다음 알림을 통해 취약한 요청을 차단하는 두 부분으로 구성된 시스템을 만들었습니다.

다운로드가 처음 수신되면 당사 시스템은 사용 중인 curl 버전에 대한 User-Agent 헤더를 검사합니다. 이는 취약할 수 있는 이전 버전의 curl을 사용하고 있는지 확인하기 위해 수행됩니다.

/**
 * Determines if a curl request may be vulnerable to CVE-2018-1000007
 *
 * @param Request $request
 * @return bool
 */
protected function curlMayBeVulnerable(Request $request)
{
    if (! $request->hasHeader('Authorization')) {
        return false;
    }

    [$agent, $version] = explode('/', $request->userAgent());
    $version = new Version($version);
    $vulnerableVersion = new Version('7.58.0');

    if ($version->lt($vulnerableVersion)) {
        return true;
    }

    return false;
}

귀하가 취약할 수 있는 curl 버전을 사용하고 있다고 판단되면 당사가 제어하는 ​​별도의 보안 도메인으로 리디렉션을 보냅니다.

이 동작은 개인 키를 외부 조직에 노출하지 않고 실제 보안 취약점을 모방합니다.

특별히 제작된 이 리디렉션은 Authorization 헤더가 여전히 존재하는지 확인합니다. 그렇다면(그렇지 않아야 함) 현재 curl 버전이 CVE-2018–1000007에 취약하다는 의미입니다.

귀하가 이 공격에 취약하다고 판단되면 요청이 계속되는 것을 적극적으로 차단하고 콘솔에 오류 메시지를 표시합니다.

The version of curl you are using has a known security vulnerability that prevents us from safely allowing you to download your files. See [https://curl.haxx.se/docs/CVE-2018-1000007.html](https://curl.haxx.se/docs/CVE-2018-1000007.html) for more information.

보안과 편의성의 균형을 맞추는 것은 끊임없는 싸움입니다. 우리는 문제를 쉽게 무시하고 고객이 파일을 검색하는 동안 Authorization 헤더를 외부 조직에 노출하도록 허용할 수 있었습니다.

잠재적으로 경험에서 벗어날 수 있지만 모든 취약한 요청을 차단하는 것이 최선의 조치라고 믿었습니다. 이것은 사용자와 파일을 보호합니다.

keep.sh is a free file transfer service that allows you to transfer files easily with a simple command line on any server. We recommend you try it today! curl — upload-file file.txt

좋은 웹페이지 즐겨찾기