Rilide는 LumaC2 및 QueryGenesis라고도 알려져 있으며 Chromium 기반 브라우저를 대상으로 사용자 활동을 탈취하고 민감한 데이터를 훔치는 정교한 멀웨어입니다. 2023년에 발견된 Rilide는 브라우저 확장 프로그램을 이용해 공격을 수행합니다. Rilide는 브라우저 확장 구성 요소를 악용하여 웹 페이지에 악성 스크립트를 삽입합니다. 데이터 유출 기능뿐 아니라 주요 지갑과 메일 클라이언트를 대상으로 2단계 인증(2FA)을 조작해 암호화폐를 탈취하는 고급 기능도 갖추고 있습니다.
2025년 초부터 Trusteer 연구소는 5만 건 이상의 감염된 사용자 세션을 확인했으며 이는 위협 활동의 규모를 보여줍니다. Trusteer 연구소는 Rilide가 북미, 남미, 유럽 및 일본을 공격하는 전 세계적인 캠페인을 진행 중임을 포착했습니다.
이 글에서는 Rilide가 확장 프로그램을 통해 브라우저 내에서 어떻게 작동하는지 살펴보고 공격을 수행하는 데 사용하는 기법과 특히 금융 플랫폼에 미치는 영향을 분석합니다.
Rilide의 기능은 단일 페이지 내 JavaScript 코드를 사용하는 전통적인 웹 인젝션에서 브라우저 확장 프로그램으로의 위협 환경 변화를 부각시킵니다. 브라우저 확장 프로그램을 이용하면 이를 사용하지 않고서는 달성하기 어려운 많은 기능을 구현할 수 있습니다. 다음 분석에서는 확장 프로그램이 얼마나 강력한지, 그리고 최신 멀웨어가 이를 선호하는 이유를 설명합니다.
과거 대부분의 'Man-in-the-Browser' 공격은 멀웨어가 브라우저 메모리를 스캔하여 특정 HTML 패턴을 식별하고 페이지의 인메모리 콘텐츠에 직접 <script> 태그를 삽입하는 방식으로 수행되었습니다. 악의적인 의도에도 불구하고 이러한 스크립트는 샌드박스 환경 내에서 작동하고 동일 출처 정책을 준수하며 주입된 페이지의 수명 주기에 따라 제한을 받는 등 여전히 브라우저의 보안 메커니즘에 종속되어 있었습니다.
예를 들어 주입된 스크립트는 다른 출처의 쿠키나 리소스에 액세스할 수 없었으며 페이지가 닫히면 지속되거나 실행될 수 없었습니다.
반면 악성 브라우저 확장 프로그램을 이용한 최신 공격은 이러한 제약을 대부분 극복했습니다. 확장 프로그램은 특정 웹페이지와 독립적으로 작동하며 백그라운드에서 지속적으로 실행될 수 있습니다. 또한 동일 출처 제약을 우회하고 쿠키나 스토리지와 같은 브라우저 전체 리소스에 접근할 수 있는 확장된 권한을 가지고 있으며 페이지가 열려 있지 않아도 활성 상태를 유지할 수 있습니다. 이러한 변화로 인해 브라우저 확장 프로그램은 공격자에게 전통적인 웹 인젝션보다 훨씬 높은 수준의 지속성과 제어력을 제공하는 강력한 도구가 되었습니다.
확장 프로그램은 JavaScript 실행 컨텍스트에도 변화를 가져왔으며 이는 자체적인 악의적인 이점을 제공합니다. 전통적인 웹 인젝션은 보안 도구를 포함한 웹 애플리케이션 코드와 동일한 컨텍스트에서 실행되었습니다. 스크립트 요소, 네트워크 요청, js 변수 등 남겨진 증거가 있는 경우 멀웨어를 탐지할 수 있었습니다.
현재는 페이지 컨텍스트 외에 두 가지 JavaScript 환경이 추가로 존재합니다.
이들 컨텍스트 간의 모든 통신은 페이지나 개발자에게 보이지 않는 정의된 브라우저 인터페이스를 통해 이루어집니다. 확장 프로그램의 대부분의 동작과 증거는 설계상 격리되어 있으며 메인 문서에 변경이 없으면 탐지가 특히 어렵습니다.
향상된 회피 기능을 제공할 뿐만 아니라 최신 브라우저 API가 제공하는 광범위한 내장 기능과 권한 덕분에 브라우저 확장 프로그램 개발 역시 비교적 간단합니다. 다음 분석은 확장 프로그램을 통해 복잡한 공격을 쉽게 개발할 수 있는 방법을 보여줍니다.
확장 프로그램이 제공하는 향상된 제어력, 지속성, 회피 능력 및 개발 용이성을 고려할 때 기존의 'Man-in-the-Browser' 기법에서 확장 프로그램 기반 공격으로의 전환은 이해 가능할 뿐 아니라 브라우저 기반 위협의 진화에서 불가피합니다.
확장 프로그램의 기능과 액세스 수준을 정의하는 핵심 구성 요소인 매니페스트 파일로 Rilide를 분석을 시작하겠습니다. 이 파일은 Rilide의 악성 기능을 이해하기 위한 첫 번째 단서를 제공합니다.
분석된 변종 중 하나는 자신을 Google Drive 확장 프로그램으로 위장하고 있습니다.
이후 필요한 권한 목록이 표시됩니다. 이 목록에는 다음을 포함하되 이에 국한되지 않는 여러 가지 핵심 브라우저 기능이 포함되어 있습니다.
“host_permission”에서는 확장 프로그램이 <all_ urls>에 액세스하고 상호 작용할 수 있도록 허용되어 있습니다. 이는 브라우저가 지원하는 모든 스킴, 도메인, 경로 및 포트를 포함한다는 의미입니다.
또한 “content scripts”는 모든 URL에서 document_start 시점에 실행되도록 설정되어 있습니다. 이는 브라우저가 페이지 로드를 시작하자마자 콘텐츠가 완전히 렌더링되기 전에 스크립트가 실행됨을 뜻합니다.
main.js 스크립트는 일반적인 정보 탈취 기능을 포함하며 gmail.js는 Gmail 클라이언트 페이지를 대상으로 합니다. 그럼에도 불구하고 모든 스크립트는 모든 페이지에 삽입됩니다.
“declarative_net_request”에서는 확장 프로그램은 여러 콘텐츠 보안 정책(CSP) 헤더를 제거하도록 규칙이 설정되어 있습니다. 이를 통해 Rilide는 보안 제한을 우회하고 인라인 콘텐츠를 삽입할 수 있습니다.
“background”에서는 확장 프로그램의 서비스 워커가 설정됩니다. 여기에서 멀웨어가 브라우저 이벤트를 모니터링하고 C2 서버와의 통신을 설정합니다. 다음으로 백그라운드 스크립트 분석을 통해 멀웨어가 브라우저 이벤트를 감지하고 공격 전략을 실행하는 방식을 자세히 살펴보겠습니다.
Background.js에는 확장 프로그램 설치 이벤트 발생 시 실행되도록 설정된 초기화 코드가 포함되어 있습니다. chrome.system 호출을 통해 CPU 및 스토리지 세부 정보와 같은 기기 정보를 수집하고 chrome.management를 사용하여 설치된 확장 프로그램 데이터를 가져옵니다. 고유 ID는 jspm을 통해 가져온 npm uuid 모듈을 사용하여 생성되며 로컬 스토리지에 저장됩니다. 마지막으로 빈 필터 매개변수를 사용하여 chrome.cookies.getAll을 통해 모든 쿠키를 가져옵니다.
이 데이터는 C2 서버로 전송되며 응답을 통해 확장 프로그램의 프록시 기능을 활성화할 수 있습니다. 또한 확장 프로그램 초기화 중에 인젝션, 명령어 및 멀웨어 설정도 가져옵니다.
초기화의 마지막 단계는 CSP 제거 규칙을 활성화하는 것이며 이후 멀웨어는 브라우저 이벤트 설정 및 모니터링을 할 준비가 됩니다. 이는 브라우저 확장 프로그램을 사용하는 것이 기존 웹 인젝션 기술에 비해 정보를 쉽게 수집할 수 있다는 이점을 다시 한 번 보여줍니다.
이전 Rilide 버전에서는 C2 도메인이 JavaScript 파일에 직접 하드코딩되어 있었습니다. 다른 변종은 특정 비트코인 지갑에서 거래 세부 정보를 가져와 도메인을 추출했습니다.
여기서 분석된 신규 변종에는 Telegram 봇에서 도메인을 가져오도록 설계된 코드가 포함되어 있습니다. 도메인을 가져오기 위한 주기적 호출은 Google Chrome 알람을 사용하여 매분 실행되도록 설정됩니다.
이 방법을 통해 멀웨어는 도메인이 탐지되어 차단될 경우 쉽게 도메인을 전환할 수 있습니다.
이 변종에는 Telegram 토큰이 포함되어 있지 않지만 이 방법은 향후 버전에서 등장할 가능성이 높습니다.
콘텐츠 스크립트는 chrome.runtime.sendMessage를 사용하여 페이지의 모든 입력 요소 값을 'new-grabber-info' 메시지 유형으로 전송합니다.
C2 서버로 데이터를 전달하기 위한 다음과 같은 리스너가 background.js에 설정되어 있습니다.
추가적으로 백그라운드는 “set-screenshot-result” 메시지를 기다리고 있습니다.
이러한 메시지는 chrome.tabs.captureVisibleTab을 사용하여 스크린샷을 찍고데이터를 C2로 다시 전송하는 트리거 역할을 합니다.
이러한 방법을 통해 사용자가 은행 사이트에 로그인할 경우 다양한 민감한 데이터가 도난당할 수 있습니다. 여기에는 사용자 이름, 비밀번호, 계좌 번호, PIN 코드, 신용카드 정보, 보안 질문 답변, 송금 수신자 정보 등이 포함됩니다.
백그라운드 스크립트의 마지막 부분에서는 명령 가져오기 및 프록시 검사를 위한 주기적 호출이 “chrome.alarms”를 사용하여 설정됩니다. 명령 알람은 C2에서 명령 목록을 가져와 하나씩 실행합니다.
프록시 검사 알람은 프록시 연결 상태를 확인하고 필요 시 새로운 연결을 시작합니다. 리스너가 설정되면 백그라운드 스크립트의 동기 실행이 완료됩니다.
cmds.js는 C2로부터 미리 정의된 목록의 명령과 매개변수를 수신하고 필요 시 결과를 반환하는 코드를 포함하고 있습니다.
몇 가지 흥미로운 명령은 다음과 같습니다.
다른 명령은 확장 프로그램 구성 변경, 기기 정보 및 현재 URL 가져오기 등을 가능하게 합니다. 이 명령 세트는 멀웨어의 워크플로와 실행을 동적으로 변경할 수 있어 사용자 상호작용을 유도하는 데 효과적입니다. 이러한 명령의 대부분은 Chrome 확장의 내장 기능을 활용하므로 멀웨어 작성자가 쉽게 개발할 수 있습니다.
main.js 콘텐츠 스크립트는 익명 함수 내에서 초기화된 jQuery 라이브러리로 시작하며 외부 가져오기 없이 인라인으로 완전히 포함되어 있습니다. 이후 난독화된 코드가 악성 기능을 실행합니다.
Chromium 확장 아키텍처는 확장 프로그램이 인젝션 책임을 분리하여 탐지가 더 어렵게 만듭니다. 서비스 워커는 초기화 단계에서 인젝션을 다운로드하고 저장하며, 콘텐츠 스크립트는 이를 읽고 실행합니다. 페이지 컨텍스트에서는 웹 요청이 전송되지 않아 멀웨어가 탐지되지 않도록 돕습니다. main.js는 가져온 모든 인젝션을 반복하며 현재 URL이 인젝션 URL과 일치하면 이를 주입합니다.
Rilide는 DOM에 스크립트를 주입하는 영리한 방법을 사용합니다.
이는 인젝션을 이벤트 핸들러로 사용하는 "onreset" 문서 속성을 생성합니다. 그런 다음 즉시 사용자 정의 "reset" 이벤트를 보내어 인젝션을 실행하고 마지막으로 속성을 제거합니다.
이 속성은 "setAttribute" 호출과 "removeAttribute" 호출 사이의 특정 시간에 설정되어 보안 도구가 탐지하기 어렵게 만듭니다.
마지막 함수 호출은 일반적인 데이터 탈취 리스너를 설정합니다.
jQuery 셀렉터를 사용하여 모든 입력 요소가 선택되고 "change" 이벤트 리스너가 설정됩니다.
"change" 이벤트는 입력 필드의 값이 변경되고 포커스를 잃을 때(예: 사용자가 다른 요소를 클릭하는 경우)마다 발생합니다. 예를 들어 피해자가 은행 계정에 로그인할 때 비밀번호 필드를 클릭하면 사용자 이름이 수집되고 사용자가 양식을 제출할 때 비밀번호 입력이 탈취됩니다. 데이터는 chrome.runtime.sendMessage를 통해 서비스 워커로 전송되며 이후 C2 서버로 전달됩니다.
이 스크립트의 목표는 출금 2FA 인증 요청을 새 기기 인증 요청으로 교체하는 것입니다. 이러한 접근 방식은 고객이 무단 출금을 인식하지 못하게 하며 새 기기 인증을 출금보다 덜 의심스럽게 여길 가능성이 높습니다.
이 스크립트는 jQuery 라이브러리의 인라인 초기화와 현재 위치에 "mail.google"이 포함되어 있는지 확인한 후 실행을 시작합니다. 인젝션은 주기적으로 주요 암호화폐 지갑의 이메일을 확인하고 감지되면 해당 지갑 기능을 호출합니다.
jQuery 셀렉터는 지갑 이름을 텍스트로 포함하는 "divs"를 사용하여 매우 간단합니다.
특정 공급업체의 사용자 정의 인젝션을 시연하겠지만 모든 인젝션은 유사하게 작동합니다.
코드는 "Withdrawal Request" 텍스트가 포함된 요소를 찾아 "Authorize New Device"로 교체합니다.
또한 "withdrawal" 텍스트가 포함된 span 요소를 찾아 이메일 미리보기 내용을 교체합니다.
주입 전:
주입 후:
이메일 본문은 다음과 같은 방식으로 찾을 수 있습니다.
간단히 말해 스크립트는 "check address carefully" 텍스트가 있는 하위 "div" 요소를 가진 CSS 클래스 "ii"의 모든 요소를 찾습니다. 또한 요소 및 인증 코드 텍스트 스타일을 기반으로 인증 코드를 추출합니다. 이 요소 식별 방법은 스타일, 텍스트 또는 구조의 작은 변경으로 인해 쉽게 깨질 수 있어 그다지 안정적이지 않습니다.
마지막으로 이메일의 HTML 콘텐츠는 하드코딩된 내용으로 덮어쓰입니다.
원본 내용:
새로운 내용:
이 메커니즘은 위협 행위자가 사용자를 출금에 대해 경고하지 않고 암호화폐를 출금할 수 있도록 합니다.
확장 프로그램을 통해 쉽게 구현되는 또 다른 눈에 띄는 기능은 프록시 기능입니다. Rilide는 피해자의 브라우저를 HTTP 프록시로 변환하여 피해자의 자격 증명과 데이터를 사용해 모든 요청을 전달할 수 있게 합니다.
이 기능은 특히 금융 사기에 위험합니다. 공격자들이 추가 인증 검사를 유발하지 않고 은행 포털, 거래 계좌 및 결제 플랫폼에 액세스할 수 있기 때문입니다. 이들은 합법적인 사용자 활동으로 가장하여 거래를 시작하거나 계정 설정을 변경하거나 자금을 유출할 수 있으며 IP 주소 추적과 같은 전통적인 보안 조치를 우회할 수 있습니다. 공격자는 효과적으로 피해자를 사칭함으로써 신뢰 기반 메커니즘을 악용하여 무리 없이 사기 행위를 수행할 수 있습니다.
이 기능은 해당 유형의 공격에 대한 개념 증명을 보여주는 교육용 프로젝트인 CursedChrome에서 직접 복사한 것이기 때문에 구현이 놀라울 정도로 간단했습니다.
프록시는 확장 프로그램 서비스 워커를 사용해 공격자의 C2 서버와 WebSocket 연결을 설정하는 방식으로 작동합니다. 이 연결을 통해 서비스 워커는 공격자가 보낸 명령을 받을 수 있습니다. 이러한 명령은 요청을 만들거나 웹사이트를 탐색하는 등 프록시의 작업을 지시합니다. 요청은 피해자가 수집한 쿠키를 사용하여 이루어지고 응답은 C2로 다시 전송됩니다.
CursedChrome 코드 예시:
Rilide 코드 예시:
일부 이름 차이와 함수 정의 위치를 제외하면 코드는 동일합니다. 이 프로젝트는 백엔드 코드와 관리 사용자 인터페이스(UI)까지 포함되어 있어 공격자들이 쉽게 악용할 수 있습니다.
Rilide는 브라우저 확장 프로그램이 브라우저 개입자 공격의 위협 환경을 어떻게 변화시켰는지 보여줍니다. 공격자는 확장 프로그램의 능력을 활용하여 브라우저에 대한 전례 없는 제어 권한을 확보하여 기존의 인페이지 웹 인젝션의 한계를 훨씬 뛰어넘는 정교하고 지속적인 악용을 가능하게 합니다. 이러한 변화는 확장 기반 공격의 단순성과 강력한 성능으로 인해 사이버 범죄자들에게 매력적인 벡터이기 때문에 경계와 강력한 방어에 대한 필요성이 커지고 있음을 보여줍니다.
자신을 보호하기 위해 사용자는 설치된 브라우저 확장 프로그램을 정기적으로 검토하고 익숙하지 않거나 의심스러운 확장을 즉시 제거해야 합니다.
또한 이메일 계정을 모니터링하여 예상치 못한 로그인 시도와 같은 이상 활동을 감지하고 암호화폐 지갑에서 허가되지 않은 거래나 알 수 없는 행동을 주의 깊게 살펴보는 것이 중요합니다. 이러한 진화하는 공격 패러다임에 대응하기 위해 선제적이고 신중한 자세를 유지하는 것이 위험을 완화하는 데 도움이 될 수 있습니다.
IBM® Trusteer는 옴니채널 고객 여정 전반에서 사기 및 멀웨어를 탐지하고 사용자를 인증하며 신원 신뢰를 구축할 수 있도록 지원합니다. 500개 이상의 주요 조직이 고객의 디지털 여정을 보호하고 비즈니스 성장을 지원하기 위해 Trusteer를 활용하고 있습니다.
historytab.js | 2b72cc2c0c53321a472471c5189fdb56 |
notif.js | 8679a34885a02e94189c8fec5132245a |
config.js | 408d8fa7eade661e9a02b6065b792fca |
ico.png | 40de419c81de274c26c63e0f23d91a3f |
scrrule.js | 9db73e9a3a24070de075da13fdea01ab |
exts.js | 868eb23af363b5790d16103d2dd94178 |
rules.json | 6c1f6ab3492a615404a70161303de746 |
manifest.json | fd7d90a5e31cd19bbc65095d722c1525 |
utils.js | bd14616118af50f6e0b886bd90144845 |
content-scripts-register-polyfill.4.0.0.js | 5bf61a91e003afb1e169e3e3be336cac |
app.html | 08785f3794a7ae9aab6b3fa669646794 |
background.js | 1de94fff2cb80f44d82d69f816139974 |
main.js | 6c19e1bf9a7eac2c9b44f5e5c0b76d39 |
gmail.js | 49c851c025506d0a570d75bc00c7605a |
csp.js | 15606d8d8d6ca797c2c98c20114619b4 |
exchangeSettings.js | 2dcf7f099c08f9d074994a0a4f996720 |
screen.js | 7d0defc1a08d5a58d95f5ca38509c8ef |
domain.js | bb0bc698eb64447a3ab581517273487b |
inj.js | 3d67fa8a26390e8819d6bd36a2c5959f |
set.js | 8049e7bd36a88f7a393b7ff0746a04db |
proxing.js | b4b2510d7ec41711ef29ddddd4cab09a |
cmds.js | 0ebb9b78c38ae45884b85632fe087e49 |
machine.js | c43644bed7d94e3ec880af3195e4c906 |
extFiles.zip | 3113c21eee9704b14437edb5c6f29634 |
도메인:
statbrwsr.digital