缺陷解释
侧信道数据泄露发生在应用程序错误处理敏感信息时,可能将这些数据存储在设备中的不安全位置。例如:
- 日志文件
- 缓存区域
- 剪贴板
- URL 或 Cookie 缓存
这些位置可能被运行在同一设备上的恶意应用程序轻松访问,进而导致敏感信息的泄露。
漏洞风险
- 攻击者可以通过少量代码轻松定位并访问存储敏感数据的位置。
- 即便用户未显式存储数据,某些系统行为或不安全的开发实践可能会意外泄露敏感信息。
常见泄露类型
- Leaking Content Providers:未正确保护的内容提供者接口,可能导致未经授权的访问。
- Copy/Paste Buffer Caching:敏感数据放置在剪贴板,可能被其他应用读取。
- Logging:调试日志中包含敏感信息,例如密码或身份验证令牌。
- URL Caching:应用程序未正确管理 URL 缓存,可能泄露会话信息。
- Browser Cookie Objects:未保护的浏览器 Cookie 可能被恶意程序劫持。
- Analytics Data Sent to Third Parties:通过不可信的第三方 API 发送数据,可能导致隐私信息泄露。
漏洞详解与示例
1. 泄露内容提供者 (Leaking Content Providers)
问题代码
public class MyContentProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// 未验证权限直接返回敏感数据
return database.query(uri, projection, selection, selectionArgs, sortOrder);
}
}
漏洞分析
- 未验证访问权限,任何应用都可以通过 URI 访问敏感数据。
修复后的代码
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
if (checkPermission()) {
return database.query(uri, projection, selection, selectionArgs, sortOrder);
} else {
throw new SecurityException("Unauthorized access!");
}
}
2. 拷贝/粘贴缓冲区 (Copy/Paste Buffer Caching)
问题场景
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText("Sensitive Info"); // 将敏感信息直接放置于剪贴板
漏洞分析
- 剪贴板数据全局可见,任何应用均可读取。
修复措施
- 避免将敏感信息放置于剪贴板。
- 如果必须使用剪贴板,确保数据加密。
3. 日志泄露 (Logging)
问题代码
Log.d("UserPassword", "Password: " + password); // 日志中直接记录敏感信息
漏洞分析
- 调试日志可能包含用户名、密码或身份验证信息,攻击者可以通过 adb logcat 或其他工具读取日志。
修复后的代码
if (BuildConfig.DEBUG) {
Log.d("UserDebugInfo", "Password is entered"); // 在调试模式中记录无敏感数据的提示
}
4. URL缓存和浏览器Cookie对象 (URL Caching & Cookies)
问题代码
WebView webView = new WebView(context);
webView.loadUrl("http://example.com?session=12345"); // URL 中泄露敏感会话信息
漏洞分析
- 未加密的会话 ID 或敏感信息在 URL 中传递,容易被中间人攻击或缓存泄露。
修复后的代码
webView.loadUrl("https://example.com"); // 强制 HTTPS 连接避免信息泄露
5. 分析数据发送给第三方 (Analytics Data)
问题场景
AnalyticsService.sendData("UserID", userId); // 将用户 ID 发送至第三方 API
漏洞分析
- 第三方 API 或恶意插件可能拦截敏感信息,例如设备标识或地理位置。
修复措施
- 检查第三方库的可信度和安全性。
- 确保敏感信息加密传输,并限制不必要的数据分享。
缓解措施
- 保护内容提供者
- 确保 URI 访问受权限限制。
- 在敏感查询操作中添加访问控制逻辑。
- 避免敏感信息的日志记录
- 调试日志中仅记录无关紧要的信息。
- 使用动态标志(如 BuildConfig.DEBUG)控制日志输出。
- 限制剪贴板的敏感信息存储
- 避免在剪贴板中直接存储敏感信息。
- 如果必须使用,确保剪贴板数据加密并快速清除。
- 安全管理 WebView 和 URL 缓存
- 使用 HTTPS 协议确保安全传输。
- 禁用 WebView 的缓存功能以保护敏感数据。
- 选择可信第三方 API
- 检查第三方库的隐私政策和安全性。
- 加密敏感数据后再传递给第三方服务。
参考文献
- OWASP Mobile Top 10 - M4: Insecure Data Storage
- CWE-532: Insecure Logging
- CWE-200: Exposure of Sensitive Information
通过识别和修复侧信道数据泄露漏洞,可以有效保护敏感数据安全,防止攻击者利用这些意外暴露的资源进行攻击。
-------------------------------------------------------------------------------------------------------------------------------
工作:SAST工具推介、评测、代码审计、培训资料、应用安全咨询、SAST检测规则、安全漏洞数据处理、许可证数据处理、组件数据处理等。