본문 바로가기
MAKESITE

점검 항목 · 보안

SRI 무결성 해시 미적용

우리 서버를 아무도 건드리지 않아도 우리 화면이 바뀔 수 있습니다. 남의 서버에 있는 파일 하나를 우리가 매 방문마다 받아 실행하고 있고, 그 파일이 어제와 같은지 확인하는 절차가 없기 때문입니다.

심각도 보통 보안 무료 스캔 판정 항목 /check/sri-integrity

01DEFINITION

한 줄로 말하면

외부에서 불러오는 스크립트에 무결성 해시를 붙여 두면, 파일이 조금이라도 달라졌을 때 브라우저가 실행을 거부합니다. 이 한 줄이 없으면 배포처가 바뀌었는지 우리 쪽에서는 알 방법이 없고, 바뀐 사실은 대개 사고가 난 뒤에 드러납니다.

02RISK

없으면 무슨 일이 생기나

외부 주소로 스크립트를 불러오는 순간 그 파일의 관리 권한이 우리 손을 떠납니다. 방문자의 브라우저는 그 주소로 직접 요청을 보내고, 돌아온 내용을 우리 페이지와 같은 권한으로 실행합니다. 그 파일이 어제와 다른 내용이어도 브라우저는 아무 말도 하지 않습니다. 배포처가 계정을 잃었거나, 도메인이 만료되어 다른 사람에게 넘어갔거나, 내부자가 한 줄을 더했을 때 우리 쪽에는 아무 흔적도 남지 않습니다.

실제로 이 방식으로 벌어진 사고는 결제 화면에서 가장 비쌌습니다. 통계나 채팅 위젯 스크립트가 바뀌면서 입력 폼의 값을 다른 서버로 함께 보내는 코드가 몇 줄 붙었고, 화면은 평소와 똑같이 동작했습니다. 이용자도 운영자도 이상을 느낄 자리가 없었고, 카드사 쪽에서 피해가 몰려 든 뒤에 원인을 거슬러 올라가 찾았습니다.

무결성 해시는 그 자리를 브라우저에게 검사시킵니다. 파일의 지문을 우리가 태그에 적어 두면, 브라우저는 받은 내용의 지문을 계산해 비교하고 다르면 실행하지 않습니다. 막는 것이 아니라 알아채는 장치에 가깝습니다. 다른 것을 받으면 그 기능이 동작하지 않으므로 우리가 그날 알게 됩니다.

03CHECK IT YOURSELF

직접 확인하는 방법

아래는 저희를 거치지 않고 지금 해 보실 수 있는 방법입니다. 결과를 저희에게 보내실 필요도 없습니다.

  1. 01
    외부 주소로 부르는 스크립트를 먼저 셉니다

    우리 도메인이 아닌 주소를 가리키는 script 태그를 뽑습니다. 여기 나오는 것이 전부 대상입니다. 개수 자체가 이 항목과 외부 스크립트 항목의 출발점입니다.

    $ curl -s https://example.com/ \
      | grep -oE '<script[^>]+src="https?://[^"]+"' \
      | grep -v 'example\.com'

나머지 확인 방법 2단계는 셀프수리 가이드에 있습니다.

04HOW TO FIX

고치는 방법

서버 환경에 따라 적을 자리가 다릅니다. 아래는 가장 흔한 구성 기준이고, 적용 전에 현재 설정을 백업하십시오.

해시를 계산해 태그에 적습니다

파일을 받아 지문을 뽑고 그 값을 integrity 에 적습니다. crossorigin 을 함께 적어야 브라우저가 내용을 읽을 수 있고, 빠뜨리면 검사 자체가 성립하지 않아 파일이 실행되지 않습니다.

버전이 박힌 주소로 바꿉니다
해시를 못 붙이는 것은 우리 쪽으로 옮깁니다
조치 코드는 셀프수리 가이드에 있습니다. 서버 구성별 설정 원문 3단계와, 귀사 사이트에서 실제로 관찰된 값이 함께 실립니다 — 무엇을 어디에 적어야 하는지가 정해집니다.
가이드 안내 보기 · 먼저 무료로 진단받기
이미 열람권을 구매하셨다면 안내 메일의 가이드 링크로 바로 열립니다 — 링크를 잃으셨다면 문의 주시면 다시 보내 드립니다.
주의. 무결성 해시는 파일이 바뀐 것을 알아채는 장치이지 나쁜 파일을 가려내는 장치가 아닙니다. 처음부터 위험한 코드가 들어 있었다면 해시는 그것을 그대로 통과시킵니다. 무엇을 싣고 있는지 세어 보는 일이 먼저이고, 해시는 그 목록이 조용히 바뀌지 않게 묶어 두는 일입니다.

05FAQ

자주 묻는 질문

유명한 CDN 이면 안 붙여도 되지 않나요

규모가 크다고 안 바뀌는 것은 아닙니다. 오히려 널리 쓰이는 배포처일수록 한 번 바뀌었을 때 영향받는 사이트가 많아 노리는 값이 큽니다. 그리고 해시를 붙이는 비용은 배포할 때 한 줄이라 규모와 상관없이 같습니다.

해시를 붙였는데 화면이 멈췄습니다

받은 파일이 적어 둔 지문과 다르다는 뜻입니다. 배포처가 파일을 갱신했거나, 최신판을 주는 주소를 쓰고 있거나, crossorigin 속성을 빠뜨린 경우입니다. 브라우저 콘솔에 어느 파일이 거부됐는지 나오므로 그 주소부터 확인하십시오.

스크립트가 아니라 스타일시트도 해당되나요

됩니다. 외부 스타일시트도 같은 속성을 붙일 수 있고, 화면을 통째로 바꿔 놓는 공격에 쓰일 수 있으므로 같이 보는 것이 맞습니다. 다만 실행 권한을 갖는 스크립트 쪽이 잃을 것이 훨씬 크므로 순서는 스크립트가 먼저입니다.

해시를 관리하기가 번거롭습니다

외부 파일을 버전과 함께 고정해 두면 바꿀 일 자체가 드뭅니다. 자동화가 필요하다면 빌드 단계에서 파일을 받아 지문을 계산하고 태그에 채워 넣는 방식이 흔합니다. 손으로 관리하기 어려울 만큼 외부 파일이 많다면, 그 개수 자체가 먼저 볼 문제입니다.
여기까지는 항목 일반론입니다. 무엇이고 왜 문제이며 어떻게 고치는지는 감출 이유가 없어 그대로 적었습니다. 리포트에 들어가는 것은 귀사 사이트에서 실제로 어떤 값이 나왔는지 — 어느 주소의 어느 응답인지, 그 환경에서 어떤 순서로 적용해야 하는지, 예상 공수가 얼마인지입니다. 이 페이지만 보고 직접 고치셔도 되고, 실제로 그러시라고 적어 두었습니다.

GET STARTED

내 사이트는
이 항목을 통과할까요

주소만 넣으시면 이 항목을 포함해 58가지를 판정해 점수와 실패 개수를 보여 드립니다. 로그인도, 소유 확인도 필요 없습니다 — 전부 밖에서 관찰만 하는 항목이기 때문입니다.

무료 스캔 문의하기 로그인