강좌 강좌
event.isTrusted 입문: 진짜 클릭과 스크립트가 만든 클릭
웹에서 클릭이 일어났을 때 그것이 실제 사용자의 행동인지 스크립트가 만든 것인지 구분하는 표시 값이 event.isTrusted다. 실제 보안 연구 사례에서 이 값이 어떤 신호였고, 그것을 확인하지 않은 코드가 어떤 결과를 낳았는지 따라가 본다.
한 문장으로 이해하기
이 강좌를 마치면 세 가지를 할 수 있다. 첫째, 매니폴드 시큐리티의 사례에서 event.isTrusted 값이 무엇을 알려주는 신호였는지 설명할 수 있다. 둘째, 코드가 그 값을 확인하지 않았을 때 어떤 결과가 이어졌는지 말할 수 있다. 셋째, 기본 설정과 ‘묻지 않고 실행’ 설정에서 작업 진행이 어떻게 달랐는지 구분할 수 있다. 사전지식으로는 클릭 같은 사용자 행동이 브라우저에서 이벤트(event)라고 불린다는 것과, 이 사례처럼 스크립트가 claude.ai 같은 웹 페이지에서 실행될 수 있다는 것 정도면 충분하다.
입력 출처는 event.isTrusted를 실제 사용자 클릭과 스크립트가 보낸 클릭을 구분하는 표시 값으로 설명한다. 매니폴드 시큐리티가 claude.ai에서 인공 클릭을 시연했을 때, 그 로그에는 이 값이 false로 표시됐다.
왜 필요한가
웹에서는 사람 대신 코드가 클릭을 흉내 낼 수 있다. 매니폴드 시큐리티가 다룬 사례에서, 문제가 성립하려면 다른 브라우저 확장 프로그램(extension)이 claude.ai에서 스크립트를 실행할 수 있어야 했다.
이때 처리 코드가 이벤트의 출처를 구별하지 못하면, 사람이 누른 클릭과 코드가 만든 클릭을 똑같이 다루게 된다. Claude for Chrome의 클릭 처리 코드가 바로 event.isTrusted를 확인하지 않는 상태였다.
어떻게 이루어지는가
매니폴드 시큐리티의 시연은 다음 순서로 진행됐다.
- 확장 프로그램의 스크립트가 claude.ai에서 클릭 이벤트를 인공으로 만들어 보낸다.
- 이 인공 클릭의 정보에는 isTrusted 값이 false로 담긴다.
- Claude for Chrome의 클릭 처리 코드가 이 이벤트를 받는다.
- 이 코드는 isTrusted를 확인하지 않으므로, false로 표시된 인공 클릭도 작업 활성화 신호로 처리한다.
- 다만 그 뒤 작업이 어디까지 진행되는지는 사용자의 설정에 따라 달라진다.
하나의 예시로 따라가기
아래는 입력 출처가 보도한 실제 연구 사례다.
매니폴드 시큐리티 연구팀은 claude.ai 콘솔에서 인공 클릭을 만들어 보냈다. 로그에는 isTrusted가 false로 표시됐지만, Claude for Chrome의 처리 코드는 이를 확인하지 않았기 때문에 인공 클릭이 작업 활성화 신호로 처리됐다.
실제 작업 진행은 설정에 따라 갈렸다. 기본 설정에서는 위조된 클릭 뒤에도 사용자의 승인이 필요했다. 반면 ‘묻지 않고 실행’ 설정에서는 승인 없이 작업이 진행될 수 있었다. 또한 이렇게 외부에서 활성화할 수 있는 작업은 아무거나가 아니라, 미리 허용된 고정 작업들로 제한돼 있었다.
언제 쓰고 언제 쓰지 않는가
이 사례에서 연구진은 클릭 처리 코드의 시작 부분에서 인공 클릭을 거부하는 수정을 제안했다. 즉 이 값을 확인하는 방식은 스크립트가 보낸 인공 클릭이라는 특정 경로를 막는 방법으로 제시됐다. 다만 출처의 조사 시점에는 이 수정이 배포되지 않았다고 보도됐다.
적용 범위와 한계도 함께 봐야 한다. 첫째, 앞서 봤듯 기본 설정에서는 위조 클릭 뒤에도 승인 절차가 남아 있었고, 외부에서 활성화 가능한 작업도 미리 허용된 고정 목록으로 제한돼 있었다. 둘째, 별도로 사이드 패널 URL의 매개변수와 관련된 설계 문제도 언급됐다. 다만 그것은 당시 외부 공격자가 직접 이용할 수 있는 경로는 아니었다. isTrusted 미확인과는 성격이 다른 구조적 위험으로 구분해야 한다.
핵심 정리와 확인문제
매니폴드 시큐리티의 사례에서 스크립트가 보낸 인공 클릭은 로그에 isTrusted가 false로 표시됐다. 그러나 Claude for Chrome의 처리 코드가 이 값을 확인하지 않아 인공 클릭도 작업 활성화 신호로 처리됐다. 실제 작업 진행은 설정에 따라 달라져, 기본 설정에서는 승인이 필요했고 ‘묻지 않고 실행’ 설정에서는 승인 없이 진행될 수 있었다. 연구진은 처리 코드 시작 부분에서 인공 클릭을 거부하는 수정을 제안했으나, 조사 시점에는 배포되지 않았다.
확인문제 1. 매니폴드 시큐리티가 콘솔에서 만든 인공 클릭의 로그에서 isTrusted 값은 무엇으로 표시됐는가?
정답과 해설: false로 표시됐다. 연구진이 시연한 인공 클릭의 로그에서는 isTrusted가 false로 확인됐다.
확인문제 2. Claude for Chrome의 처리 코드가 isTrusted를 확인하지 않았을 때 어떤 결과가 이어졌는가?
정답과 해설: false로 표시된 인공 클릭이 걸러지지 않고 작업 활성화 신호로 처리됐다. 처리 코드가 이벤트의 출처를 구별하지 않았기 때문이다.
확인문제 3. 위조된 클릭 이후, 기본 설정과 ‘묻지 않고 실행’ 설정에서 작업 진행은 어떻게 달랐는가?
정답과 해설: 기본 설정에서는 위조 클릭 뒤에도 사용자의 승인이 필요했지만, ‘묻지 않고 실행’ 설정에서는 승인 없이 작업이 진행될 수 있었다.