摘要
随着云计算技术的普及,GitHub Pages、Vercel等无服务器(Serverless)静态托管平台因其便捷性、免费性及高可用性,已成为现代Web开发的标准基础设施。然而,这些平台的信任机制正被网络犯罪组织恶意利用,演变为新型网络钓鱼攻击的温床。本文基于Izoologic发布的最新威胁情报,深入剖析了攻击者如何利用合法托管服务部署高隐蔽性的银行凭证窃取页面。研究发现,攻击者通过滥用自动化部署流水线、动态混淆技术及反向代理架构,成功绕过了传统基于域名信誉和静态特征的安全防御体系。此类攻击的核心特征在于“寄生性”与“瞬时性”,即攻击载荷寄宿于高信誉域名之下,且具备快速重构与销毁能力。本文详细阐述了该类攻击的技术实现路径,特别是针对多因素认证(MFA)的实时拦截机制,并构建了相应的检测模型。反网络钓鱼技术专家芦笛指出,防御此类威胁的关键在于从“基于域名的信任”转向“基于行为与内容的深度分析”,并提出了包含客户端指纹识别、DOM完整性校验及供应链安全审计在内的多维防御策略。本研究旨在揭示无服务器架构下的安全盲区,为构建适应云原生时代的反钓鱼防御体系提供理论依据与技术参考。
1. 引言
在数字化转型的浪潮中,软件开发范式经历了从单体架构到微服务,再到如今无服务器架构(Serverless Architecture)的深刻变革。GitHub Pages与Vercel等平台通过提供零配置的全球内容分发网络(CDN)和自动化的持续集成/持续部署(CI/CD)流水线,极大地降低了Web应用的发布门槛。这些平台所颁发的域名(如*.github.io、*.vercel.app)在互联网生态中天然携带着极高的信誉权重,通常被防火墙、邮件网关及浏览器安全列表视为可信源。然而,这种基于平台声誉的信任传递机制,正在被网络犯罪分子系统性地武器化。
Izoologic近期发布的威胁 advisory 揭示了一个严峻的现实:针对银行业的网络钓鱼攻击正大规模向这些无服务器托管平台迁移。攻击者不再热衷于注册看似可疑的仿冒域名(如bank-secure-login.com),而是转而利用合法的托管服务部署钓鱼页面。这种策略不仅规避了基于域名年龄、注册信息异常等传统启发式规则的检测,还利用了用户对知名技术平台的心理盲点。当用户看到一个源自github.io或vercel.app的链接时,其警惕性往往显著低于面对陌生域名时的状态。
更为棘手的是,无服务器架构的动态特性赋予了攻击者前所未有的敏捷性。借助自动化脚本,攻击者可以在数秒内完成钓鱼站点的全球部署,并在检测到安全扫描或受害者举报后立即销毁实例,实现“打带跑”(Hit-and-Run)战术。这种瞬时性使得传统的黑名单机制难以奏效,因为当安全厂商将某个特定URL列入黑名单时,攻击者早已切换至新的子域名或重构了页面代码。
反网络钓鱼技术专家芦笛强调,这一现象标志着网络钓鱼攻击进入了“基础设施滥用”的新阶段。攻击者不再需要维护复杂的后端基础设施,而是直接“寄生”在巨人的肩膀上,利用云服务商的信誉背书来掩盖其恶意意图。这种攻击模式的转变,迫使网络安全防御体系必须从静态的特征匹配向动态的行为分析与上下文感知演进。本文旨在系统解构基于GitHub Pages和Vercel的银行凭证窃取攻击链,分析其技术内核,评估其潜在危害,并提出针对性的防御框架,以应对这一日益严峻的安全挑战。
2. 无服务器托管平台被滥用的机理与优势分析
2.1 信誉传递与白名单豁免机制
无服务器托管平台被滥用的根本原因在于互联网安全防御体系中普遍存在的“信誉传递”现象。由于GitHub、Vercel等平台上承载着数以亿计的合法开源项目与企业官网,安全厂商和网络设备制造商在制定过滤策略时,往往将这些主域名及其子域名结构纳入白名单,或给予极高的信誉评分。
攻击者敏锐地捕捉到了这一防御盲区。通过在这些平台上部署恶意页面,攻击者实际上是在“借用”平台的信誉。对于大多数基于域名信誉库(Domain Reputation Database)的邮件安全网关(SEG)和Web防火墙(WAF)而言,源自username.github.io或project-name.vercel.app的流量被视为正常开发活动的一部分,从而轻易绕过入口处的第一道防线。此外,许多企业内部的DNS过滤策略也默认允许访问这些知名的开发者平台,以便员工获取技术资源,这进一步为攻击者敞开了大门。
2.2 自动化部署与敏捷攻击生命周期
与传统钓鱼网站需要手动上传文件、配置DNS不同,基于无服务器平台的攻击完全实现了自动化。攻击者利用GitHub Actions、Vercel CLI等工具,将钓鱼页面的源代码存储在私有仓库中,并通过脚本触发自动构建与部署流程。
这种自动化带来了两个关键优势:
极速扩散:攻击者可以编写脚本,瞬间生成数百个具有不同随机子域名的钓鱼站点,并并行部署到全球CDN节点。这种规模化能力使得攻击覆盖面极广,增加了受害者接触恶意链接的概率。
瞬时生存:一旦某个钓鱼链接被标记或触发警报,攻击者的自动化脚本可以立即删除对应的部署实例或仓库,使恶意URL在几分钟内失效(404 Not Found)。这种“流式”攻击模式使得事后取证和追踪变得异常困难,安全团队往往只能捕捉到攻击的残影。
2.3 成本极低与匿名性增强
使用GitHub Pages和Vercel的基本服务通常是免费的,或者成本极低。这意味着攻击者几乎无需任何经济投入即可发起大规模攻击 campaign。同时,虽然平台要求实名认证,但攻击者可以通过盗用账号、使用虚假身份注册或利用被攻陷的合法开发者账户来隐藏真实身份。这种低成本、高匿名的特性,极大地降低了网络犯罪的门槛,吸引了大量低技能攻击者(Script Kiddies)参与其中。
反网络钓鱼技术专家芦笛指出,这种“免费且可信”的基础设施组合,构成了当前网络钓鱼生态中最具破坏力的杠杆。攻击者利用云服务商的资源为自己背书,不仅节省了硬件和维护成本,更获得了一层难以剥离的合法性伪装。
3. 银行凭证窃取攻击的技术实现路径
3.1 高度仿真的前端克隆与动态渲染
针对银行机构的钓鱼页面,其核心目标是骗取用户的登录凭证(用户名、密码)及多因素认证(MFA)代码。为了达到这一目的,攻击者利用现代前端框架(如React、Vue、Next.js)在Vercel或GitHub Pages上构建高度仿真的银行登录界面。
与以往简单的静态HTML复制不同,现在的攻击页面往往采用动态渲染技术。攻击者会抓取目标银行网站的真实资产(CSS样式、JavaScript逻辑、图片资源),并将其整合到自己的项目中。为了规避基于静态哈希值的检测,攻击者会在代码中引入动态变量。例如,页面的标题、按钮文本甚至部分DOM结构会根据访问者的User-Agent、IP地址或时间戳进行微调。这种动态性确保了每个受害者看到的页面在二进制层面都是独一无二的,从而有效逃避基于文件指纹的检测系统。
3.2 反向代理与中间人攻击架构
在更高级的攻击场景中,攻击者不仅仅部署一个静态的表单页面,而是构建了一个完整的反向代理(Reverse Proxy)。利用Vercel的Serverless Functions(无服务器函数)或GitHub Actions的后台处理能力,攻击者可以搭建一个中间人(Man-in-the-Middle, MitM)代理层。
当受害者访问钓鱼站点时,请求首先到达攻击者部署在无服务器平台上的代理函数。该函数实时向真实的银行网站发起请求,获取最新的登录页面内容,并在返回给受害者之前注入恶意的JavaScript代码(如键盘记录器或表单劫持脚本)。当用户提交凭证时,数据先被发送到攻击者的控制服务器进行记录,随后代理函数再将数据转发给真实的银行网站。
这种架构的精妙之处在于:
实时性:受害者看到的是银行网站实时的内容(包括最新的安全公告、动态验证码等),极大地增强了欺骗性。
MFA绕过:由于代理层实时转发会话,攻击者可以即时捕获用户输入的MFA代码,并利用自动化工具在毫秒级时间内将其提交给银行,从而在会话过期前完成登录。这种“实时钓鱼”(Real-time Phishing)技术使得传统的MFA防护机制形同虚设。
3.3 规避检测的混淆与反调试技术
为了延长钓鱼站点的存活时间,攻击者在代码中嵌入了复杂的反调试和反爬虫逻辑。
环境感知:恶意脚本会检测运行环境。如果检测到来自安全厂商爬虫(如Google Safe Browsing、PhishTank)的IP地址或特定的Headless浏览器指纹(如Selenium、Puppeteer的默认特征),页面将显示正常的空白页或错误信息,而不是钓鱼表单。只有当检测到真实用户的浏览器环境时,恶意负载才会被激活。
代码混淆:利用JavaScript混淆器(如javascript-obfuscator),攻击者将核心的数据窃取逻辑加密并拆分,隐藏在看似无害的第三方库调用或复杂的数学运算中。这使得静态代码分析工具难以提取出明确的恶意特征。
反网络钓鱼技术专家芦笛强调,这种环境感知能力是当前防御面临的最大挑战之一。它使得被动式的扫描检测几乎失效,因为扫描器看到的永远是“干净”的页面,而真实用户却在毫无察觉中落入陷阱。
4. 攻击影响评估与安全范式的深层危机
4.1 传统防御体系的全面失效
基于GitHub Pages和Vercel的钓鱼攻击,对现有的网络安全防御体系构成了降维打击。
域名信誉库失效:由于攻击域名属于高信誉平台,传统的基于黑名单的DNS过滤和邮件网关规则无法生效。若将整个*.github.io或*.vercel.app加入黑名单,将导致大量合法业务中断,造成误报灾难。
静态特征匹配失效:动态渲染和代码混淆技术使得基于文件哈希(MD5/SHA256)和正则表达式的检测手段难以捕捉稳定的特征。
SSL证书信任误导:这些平台自动为所有部署站点颁发有效的HTTPS证书(通常由Let's Encrypt提供)。浏览器地址栏中的“小绿锁”标志进一步误导用户,使其认为站点是安全的。
4.2 用户心理防线的突破
此类攻击充分利用了用户对技术平台的信任惯性。普通用户甚至部分IT专业人员,潜意识里认为托管在GitHub或Vercel上的内容是经过审核的、安全的开发项目。这种认知偏差使得用户在面对此类链接时,其心理防御阈值显著降低。加之页面本身的高度仿真和实时交互特性,用户很难在短时间内辨别真伪。
4.3 应急响应与取证的困境
由于攻击站点的瞬时性和自动化特性,安全团队的应急响应面临巨大挑战。从发现威胁到完成分析、上报平台方、等待下架,整个周期可能长达数小时甚至数天。而在此期间,攻击者可能已经完成了数千次凭证窃取,并销毁了所有证据。此外,跨国界的云服务平台使得法律管辖权和协作流程变得复杂,进一步拖延了处置速度。
反网络钓鱼技术专家芦笛指出,这种“猫鼠游戏”的不平衡性正在加剧。攻击者利用自动化工具以分钟级的速度迭代,而防御方仍依赖人工分析和流程化的下架申请,这种速度差导致了防御的滞后与被动。
5. 多维防御策略与技术实现
面对这一新型威胁,必须摒弃单一的依赖域名信誉的防御思路,构建基于行为分析、内容检测和客户端保护的纵深防御体系。
5.1 基于行为指纹的动态检测模型
既然无法通过域名阻断,防御的重点应转向对页面行为和内容的深度分析。
DOM结构语义分析:利用自然语言处理(NLP)和计算机视觉技术,分析页面的DOM结构和视觉元素。检测是否存在知名品牌(如银行Logo)的未授权复用,以及表单提交动作是否指向非官方域名。
交互行为监控:监测页面的JavaScript行为。合法的静态托管页面通常不会有复杂的网络请求转发或键盘记录行为。如果检测到页面在后台向多个未知端点发送数据,或在输入框中注入监听器,应立即标记为高风险。
反调试对抗:部署能够模拟真实用户环境的高级爬虫,绕过攻击者的环境检测机制,获取其真实的恶意负载进行分析。
5.2 客户端侧的主动防御机制
在浏览器端或终端设备上实施主动防御是最后一道防线。
证书绑定与期望验证:推广HTTP Public Key Pinning (HPKP) 的现代化替代方案,或在其应用中验证服务端证书的预期归属。虽然这在公共Web上实施较难,但在企业环境中,可通过定制浏览器策略,限制对特定敏感站点的访问仅允许特定的证书链或域名结构。
凭据保护扩展:利用浏览器的密码管理器功能。现代密码管理器通常会将保存的凭据与特定域名绑定。如果用户在一个非预期的域名(即使是github.io)上尝试自动填充银行密码,浏览器应发出强烈警告。
运行时应用自保护(RASP):在移动端银行App中集成RASP技术,检测 WebView 是否加载了非白名单域的页面,或检测到键盘记录等异常行为时,自动阻断操作并报警。
5.3 供应链安全与平台协同治理
从根本上解决问题,需要云平台提供商与安全社区的紧密协作。
自动化滥用检测:GitHub和Vercel等平台应升级其内部的安全扫描引擎,利用机器学习模型自动识别新部署项目中的钓鱼特征(如克隆的银行UI、恶意外部链接)。
速率限制与异常行为分析:对短时间内创建大量子域名或频繁重新部署的行为实施严格的速率限制,并触发人工审查。
威胁情报共享:建立实时的威胁情报共享机制,一旦某一方发现新型钓鱼模板,立即同步给其他平台和主流安全厂商,实现联防联控。
反网络钓鱼技术专家芦笛强调,防御此类攻击不能仅靠堵截,更需要建立一种“零信任”的内容验证机制。无论域名多么可信,只要其行为模式偏离了正常静态站点的范畴,就应受到严格审查。
6. 防御原型系统的设计与代码实现
为了验证上述防御策略的有效性,本文设计了一个基于客户端JavaScript的轻量级检测原型。该脚本旨在嵌入到企业浏览器扩展或安全代理中,用于实时监测当前页面是否存在利用无服务器托管平台进行钓鱼的特征。
6.1 检测逻辑设计
该原型主要关注以下三个维度:
宿主域名检查:识别当前页面是否托管在已知的高风险无服务器子域名下(如*.vercel.app, *.github.io),同时结合当前访问的“意图域名”(用户以为自己在访问的银行域名)进行比对。
表单动作分析:检查页面中所有表单的action属性,判断其提交目标是否跨域指向非官方端点。
敏感关键词与UI指纹:检测页面中是否包含特定银行的敏感关键词(如“Secure Login”, “Account Verification”)以及Logo图像的哈希值匹配。
6.2 代码示例
以下是一个简化的JavaScript检测模块,展示了如何在客户端实时识别潜在的托管平台钓鱼攻击。
/**
* ServerlessPhishingDetector
* 用于检测基于GitHub Pages/Vercel等平台的银行钓鱼攻击
*/
class ServerlessPhishingDetector {
constructor() {
// 定义常见的无服务器托管域名后缀
this.suspiciousHosts = [
'.vercel.app',
'.now.sh',
'.github.io',
'.netlify.app',
'.firebaseapp.com',
'.azurewebsites.net'
];
// 模拟受保护的银行域名列表(实际应从配置文件加载)
this.protectedBanks = {
'chase.com': ['Chase', 'JPMorgan'],
'bankofamerica.com': ['Bank of America', 'BoA'],
'wellsfargo.com': ['Wells Fargo']
};
// 预计算的合法银行Logo哈希表 (简化示例,实际应使用 perceptual hash)
this.legitLogoHashes = new Set(['a1b2c3d4', 'e5f6g7h8']);
}
/**
* 执行检测主流程
*/
detect() {
const currentUrl = new URL(window.location.href);
const hostname = currentUrl.hostname;
const report = {
isPhishing: false,
riskLevel: 'LOW',
reasons: [],
details: {}
};
// 1. 检查宿主域名是否为无服务器平台
const isServerlessHost = this.suspiciousHosts.some(suffix => hostname.endsWith(suffix));
if (isServerlessHost) {
report.reasons.push(`检测到页面托管于无服务器平台: ${hostname}`);
// 2. 检查页面内容是否模仿受保护银行
const pageContent = document.documentElement.innerText.toLowerCase();
const title = document.title.toLowerCase();
let detectedBank = null;
for (const [domain, keywords] of Object.entries(this.protectedBanks)) {
if (keywords.some(k => pageContent.includes(k.toLowerCase()) || title.includes(k.toLowerCase()))) {
detectedBank = domain;
break;
}
}
if (detectedBank) {
report.isPhishing = true;
report.riskLevel = 'CRITICAL';
report.reasons.push(`页面内容模仿受保护银行: ${detectedBank},但托管于非官方域名`);
report.details = {
expectedDomain: detectedBank,
actualDomain: hostname,
mismatchType: 'HOSTING_MISMATCH'
};
// 3. 检查表单提交目标
const forms = document.querySelectorAll('form');
forms.forEach(form => {
const action = form.getAttribute('action');
if (action && !action.startsWith('/') && !action.includes(detectedBank)) {
report.reasons.push(`发现可疑表单提交目标: ${action}`);
}
});
// 4. 检查Logo指纹 (简化逻辑)
const images = document.querySelectorAll('img');
images.forEach(img => {
// 实际应用中应计算图片hash并比对
if (img.alt && this.protectedBanks[detectedBank].some(k => img.alt.includes(k))) {
report.reasons.push(`发现未授权的银行Logo使用`);
}
});
} else {
// 如果不是模仿特定银行,但托管在可疑平台且要求输入敏感信息
const hasSensitiveInputs = document.querySelectorAll('input[type="password"], input[name*="ssn"], input[name*="card"]').length > 0;
if (hasSensitiveInputs) {
report.isPhishing = true;
report.riskLevel = 'HIGH';
report.reasons.push('在无服务器托管平台上检测到敏感信息输入框');
}
}
}
return report;
}
/**
* 阻断并报警
*/
mitigate(report) {
if (report.isPhishing) {
console.warn('[SECURITY ALERT] Phishing Detected:', report);
// 在实际扩展中,这里会重定向到警告页面或覆盖整个文档
document.body.innerHTML = `
<div style="background:#ffebee; color:#c62828; padding:20px; font-family:sans-serif; text-align:center;">
<h1>⚠️ 安全警告</h1>
<p>检测到潜在的钓鱼攻击!</p>
<p><strong>原因:</strong>${report.reasons.join('; ')}</p>
<p>您正在访问的页面托管于非官方服务器 (${new URL(window.location.href).hostname}),但试图窃取银行凭证。</p>
<p>请立即关闭此页面,并通过官方APP或直接输入网址访问银行。</p>
<button onclick="window.close()" style="padding:10px 20px; background:#c62828; color:white; border:none; cursor:pointer;">关闭页面</button>
</div>
`;
// 阻止表单提交
document.querySelectorAll('form').forEach(f => f.addEventListener('submit', e => e.preventDefault()));
// 可选:向后端发送遥测数据
// this.sendTelemetry(report);
}
}
}
// 初始化并运行检测
window.addEventListener('DOMContentLoaded', () => {
const detector = new ServerlessPhishingDetector();
const result = detector.detect();
if (result.isPhishing) {
detector.mitigate(result);
}
});
6.3 代码逻辑解析
上述代码展示了一种基于客户端上下文的防御逻辑。它不依赖于远程黑名单,而是实时分析当前页面的托管环境与内容语义之间的不一致性。
宿主检查:首先识别域名是否属于常见的无服务器平台。
语义冲突检测:如果页面托管在这些平台上,但内容却声称是某家大型银行(通过关键词和Logo识别),则判定为高危。这是此类攻击最显著的特征——“身份与载体的错位”。
主动阻断:一旦确认风险,脚本立即覆盖页面内容,阻止用户输入任何信息,并切断表单提交流程。
反网络钓鱼技术专家芦笛指出,这种客户端检测机制是对服务端防御的重要补充。即使攻击者绕过了云端扫描,只要其在用户浏览器中渲染出恶意内容,该脚本就能基于逻辑矛盾(银行官网不可能托管在个人GitHub Pages上)进行精准拦截。
7. 结语
GitHub Pages和Vercel等无服务器托管平台的兴起,本是Web开发领域的一次效率革命,却不幸被网络犯罪组织异化为高效的攻击跳板。本文通过对Izoologic威胁情报的深度解读,揭示了攻击者如何利用这些平台的信誉背书、自动化部署能力及动态特性,构建出难以追踪且极具迷惑性的银行凭证窃取链条。这种攻击模式不仅突破了传统基于域名信誉的防御边界,更对用户的心理防线构成了严峻挑战。
研究表明,应对此类威胁不能寄希望于单一的技术修补或平台封禁,而必须建立一套涵盖行为分析、客户端保护及生态协同的综合防御体系。从基于域名的静态信任转向基于内容与行为的动态验证,是未来反钓鱼技术发展的必然方向。反网络钓鱼技术专家芦笛强调,在云原生时代,安全的定义已被重构,唯有保持对“可信基础设施”的审慎态度,持续创新检测算法,并加强全行业的威胁情报共享,才能在日益复杂的网络空间中守住金融安全的底线。
未来的研究应进一步关注利用人工智能技术自动化生成对抗样本的攻击趋势,以及探索基于区块链的去中心化身份验证机制在防止域名滥用方面的潜力。只有不断演进防御思维与技术手段,才能在这场永无止境的攻防博弈中立于不败之地。
编辑:芦笛(公共互联网反网络钓鱼工作组)