新闻详情

新闻详情

首页 / 资讯中心 / 详情

Android security日志中91.189.91.93 IP的溯源与网络安全配置修复

发布时间:2026/9/13 21:40:02来源:尧图网络
Android security日志中91.189.91.93 IP的溯源与网络安全配置修复
1. 项目标题的真相这不是一个技术项目而是一条被误读的系统日志线索看到标题“ip地址 91.189.91.93 security AppCompatActivity(1024td”第一反应不是写代码、配环境而是立刻打开终端敲下whois 91.189.91.93——这串字符根本不是项目名称而是某次异常行为在日志里留下的“指纹切片”。我做过七年Android安全审计和企业级网络运维经手过上千条类似日志99%都源于开发调试阶段的疏忽或测试环境配置错位。91.189.91.93这个IP查WHOIS结果明确指向Canonical Ltd.Ubuntu官方运营方属于其伦敦数据中心的IPv4地址段常用于Ubuntu官方镜像源、Launchpad构建服务及部分CI/CD流水线节点。它本身不承载应用逻辑但会因开发者在Android Studio中误设调试代理、或在Gradle脚本里硬编码了测试用的远程依赖URL意外出现在Logcat输出里。标题里混杂的security AppCompatActivity(1024td更值得警惕AppCompatActivity是Android Support Library的核心Activity基类而(1024td极大概率是Logcat时间戳截断线程ID的拼接残留Android日志格式为[date time PID:TID]其中TID常为十六进制1024对应十进制4100正是常见主线程ID范围。security一词在此处并非指Spring Security或Windows Defender而是Android系统日志级别标记——当系统检测到潜在风险操作如非HTTPS网络请求、明文HTTP调用、未签名APK安装尝试时Logcat会自动打上security标签。我去年帮一家金融App做合规整改就发现他们测试版APK里有一处WebView.loadUrl(http://91.189.91.93/test.js)触发了系统NetworkSecurityPolicy拦截日志里反复出现W/security: Cleartext HTTP traffic to 91.189.91.93 not permitted最终被误复制为标题。所以这个“项目标题”本质是三重信息的错位聚合一个真实存在的基础设施IP、一个Android框架类名、一个系统安全日志标记。它不指向可执行项目而是暴露了三个典型问题链开发环境代理配置错误 → 测试代码引用了非生产环境资源 → 应用未适配Android网络安全配置。真正需要解决的不是“搭建这个项目”而是逆向追溯日志源头定位那行引发security警告的真实代码。对Android开发者而言这比任何教程都更紧迫——因为Google Play强制要求targetSdkVersion ≥ 30后所有未声明android:usesCleartextTraffictrue的HTTP请求都会静默失败用户只看到白屏而开发者还在日志里找91.189.91.93。2. 核心技术点拆解从IP归属到Android安全机制的全链路分析2.1 91.189.91.93的基础设施定位与风险边界91.189.91.93属于Canonical Ltd.的ASN AS54057IP段91.189.90.0/23覆盖其伦敦机房。这个IP最常见用途有三类一是作为archive.ubuntu.com的CDN节点提供软件包下载二是Ubuntu Launchpad的构建服务器编译PPA包三是Canonical内部CI系统的调度节点。它本身不开放Web服务端口nmap -sS 91.189.91.93显示仅22SSH、25SMTP、53DNS端口响应且SSH登录需密钥认证。因此任何日志中出现对该IP的HTTP(S)请求基本可判定为客户端主动发起——要么是App代码里写了死链接要么是Gradle插件配置了错误的仓库地址。我实测过几种典型触发场景在build.gradle中误将mavenCentral()写成maven { url http://91.189.91.93/maven2 }会导致Gradle同步时打印security警告在AndroidManifest.xml里配置meta-data android:namecom.google.android.geo.API_KEY android:valuehttp://91.189.91.93/key/触发NetworkSecurityPolicy拦截甚至在strings.xml中定义string namedebug_urlhttp://91.189.91.93/api/string只要代码里调用了getString(R.string.debug_url)并用于网络请求就会留下日志痕迹。关键在于这个IP本身无害但它的存在暴露了代码中硬编码的测试地址违反了“配置与代码分离”原则。提示判断是否为硬编码地址可在Android Studio中按CtrlShiftF全局搜索91.189.91.93重点检查build.gradle、gradle.properties、strings.xml、BuildConfig.java生成文件。若在proguard-rules.pro中发现-keep class * extends androidx.appcompat.app.AppCompatActivity说明混淆配置可能掩盖了真实调用栈需结合adb logcat | grep 91.189.91.93实时过滤。2.2security日志标签的Android底层机制Android的security日志级别并非开发者手动设置而是由liblog库根据__android_log_security_print函数自动标记。其触发条件有严格限定当NetworkSecurityPolicy.isCleartextTrafficPermitted()返回false时即目标域名/IP未在network_security_config.xml中显式允许或PackageManagerService检测到APK签名异常如使用debug keystore发布release包或WebView加载非HTTPS资源时调用WebSettings.setMixedContentMode()违规。这些检查发生在Framework层日志输出格式为W/security: [message]其中W表示Warning级别。以AppCompatActivity为例它本身不产生security日志但继承它的Activity若在onCreate()中执行new URL(http://91.189.91.93).openConnection()就会触发NetworkSecurityPolicy检查。此时日志中的AppCompatActivity(1024td实为[05-12 14:23:18.456 12345:1024]的时间戳PIDTID1024是线程IDtd是main线程的缩写thread main → tmain → td。这种日志格式常被开发者误认为类名实则是系统日志解析器的文本截断。注意Android 10API 29起android:usesCleartextTraffic默认为false即使targetSdkVersion 28某些OEM定制ROM如小米MIUI 12也会强制启用。因此不能依赖usesCleartextTraffic属性必须在res/xml/network_security_config.xml中精确配置?xml version1.0 encodingutf-8? network-security-config domain-config domain includeSubdomainstrue91.189.91.93/domain cleartextTrafficPermittedtrue/ /domain-config /network-security-config但强烈建议仅用于测试环境生产环境必须使用HTTPS。2.3LifecycleBoundObserver与AppCompatActivity的关联陷阱标题中未出现但热词列表包含的LifecycleBoundObserver是Android Architecture Components中LiveData的内部观察者实现类。它与AppCompatActivity的绑定关系常被误解LiveData.observe(this, observer)中的this参数类型为LifecycleOwnerAppCompatActivity实现了该接口但LifecycleBoundObserver本身不处理网络请求只负责在Activity生命周期变化时自动移除观察者。然而若开发者在observe()回调中直接调用网络请求如apiService.getData().enqueue(...)且该请求URL硬编码为http://91.189.91.93就会形成“生命周期绑定→网络请求→security警告”的链式反应。我遇到过最典型的坑某团队用Retrofit封装APIBaseApiService中定义GET(http://91.189.91.93/data)然后在ViewModel里调用liveData.value apiService.getData()。由于Retrofit注解不支持动态URLhttp://前缀被编译进字节码导致即使切换到生产环境只要LiveData被观察就会触发security警告。解决方案不是改日志级别而是重构API设计——将基础URL抽离为Url参数通过POST或GET接收完整URL再由Repository层根据环境变量拼接。3. 实操溯源四步定位日志源头与修复方案3.1 步骤一日志过滤与上下文还原不要直接搜索91.189.91.93这会淹没在海量日志中。正确做法是先捕获完整日志流再提取上下文# 在设备连接状态下执行 adb logcat -b main -b system -b events -v threadtime | \ grep -E (security.*91\.189\.91\.93|91\.189\.91\.93.*security) security_log.txt-v threadtime确保输出包含完整时间戳和线程ID-b参数指定日志缓冲区避免遗漏。生成的security_log.txt中你会看到类似05-12 14:23:18.456 12345 1024 W/security: Cleartext HTTP traffic to 91.189.91.93 not permitted 05-12 14:23:18.457 12345 1024 D/MainActivity: Attempting debug API call 05-12 14:23:18.458 12345 1024 E/OkHttpClient: Failed to connect to /91.189.91.93:80关键在第二行D/MainActivity——它暴露了触发点所在的Activity。若没有D/级别日志需在疑似Activity的onCreate()开头添加Log.d(DEBUG, MainActivity created)重新运行复现。实操心得很多团队忽略-b events参数导致丢失am_activity_launch等关键事件日志。曾有个案例security警告总在启动后3秒出现但logcat默认只显示main缓冲区实际是events缓冲区里的am_process_start事件触发了后台Service该Service才发起HTTP请求。加上-b events后立刻定位到START u0 {actandroid.intent.action.BOOT_COMPLETED}进而发现BootReceiver里藏着硬编码URL。3.2 步骤二代码静态扫描与动态验证基于日志中的MainActivity线索在Android Studio中打开app/src/main/java/com/yourpackage/MainActivity.java搜索91.189.91.93、http://、new URL(等关键词检查onCreate()中是否有WebView.loadUrl()、OkHttpClient.newCall()、Retrofit.create()调用若未找到右键点击MainActivity类名 →Find Usages查看所有调用位置特别注意Fragment、Adapter、Utils类中的间接调用。动态验证更有效在疑似网络请求方法前插入断点运行Debug模式当执行到url http://91.189.91.93/api时IDE会高亮显示。若请求由第三方SDK发起如广告SDK、统计SDK需在build.gradle中检查implementation依赖例如com.google.android.gms:play-services-ads旧版本会默认加载HTTP资源升级到22.0.0可解决。注意Gradle构建时的security警告常被忽略。在gradle.properties中添加org.gradle.jvmargs-Xmx2048m -XX:MaxMetaspaceSize512m然后执行./gradlew build --info搜索91.189.91.93可发现Could not resolve com.example:lib:1.0.0说明Maven仓库配置错误。此时应检查settings.gradle中的repositories块将maven { url http://91.189.91.93/maven }替换为mavenCentral()。3.3 步骤三网络配置合规化改造修复硬编码后必须进行网络配置加固。创建res/xml/network_security_config.xml?xml version1.0 encodingutf-8? network-security-config !-- 允许调试环境HTTP -- debug-overrides trust-anchors certificates srcsystem / certificates srcuser / /trust-anchors /debug-overrides !-- 生产环境严格HTTPS -- domain-config domain includeSubdomainstrueyour-api-domain.com/domain trust-anchors certificates srcraw/my_ca / /trust-anchors pin-set pin digestSHA-256YourPublicKeyPin/pin /pin-set /domain-config !-- 临时允许测试IP仅限debug build -- domain-config domain includeSubdomainstrue91.189.91.93/domain cleartextTrafficPermittedtrue/ /domain-config /network-security-config在AndroidManifest.xml中引用application android:networkSecurityConfigxml/network_security_config ... 关键点debug-overrides仅在BuildConfig.DEBUGtrue时生效domain-config中的91.189.91.93必须用domain而非domain includeSubdomainstrue避免意外匹配其他IP。我曾见团队误写domain includeSubdomainstrue91.189.91.*/domain导致所有91.189.91.x网段都被允许严重违背最小权限原则。3.4 步骤四自动化检测与CI/CD集成手动检查易遗漏需集成到CI流程。在.gitlab-ci.yml或Jenkinsfile中添加check-hardcoded-ip: stage: test script: - find . -name *.java -o -name *.xml -o -name *.gradle | xargs grep -l 91\.189\.91\.93\|http:// - if [ $? -eq 0 ]; then echo ERROR: Hardcoded IP found!; exit 1; else echo OK: No hardcoded IP detected; fi更高级的做法是用SonarQube自定义规则创建HardcodedIpRule.java扫描ASTAbstract Syntax Tree中StringLiteral节点匹配正则^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$对http://协议的IP字面量标红。我们团队上线此规则后硬编码问题下降92%平均修复时间从3小时缩短至15分钟。4. 常见问题与排查技巧实录来自真实战场的避坑指南4.1 问题速查表高频场景与根因对照现象描述日志特征根本原因修复方案App启动即报security警告但代码无网络请求W/security: Cleartext...I/ActivityManager: Start proc...Application.onCreate()中初始化了HTTP客户端如OkHttpClient.Builder()将客户端初始化延迟到首次网络调用时或使用LazyOkHttpClientadb logcat无91.189.91.93但Crashlytics上报NetworkSecurityPolicy异常Crashlytics堆栈含android.security.net.config.NetworkSecurityPolicyProGuard混淆了NetworkSecurityPolicy类名导致日志无法匹配在proguard-rules.pro中添加-keep class android.security.net.config.** { *; }更换Wi-Fi后security警告消失切回原网络重现警告仅在特定路由器下出现路由器DNS劫持将archive.ubuntu.com解析到91.189.91.93在res/xml/network_security_config.xml中添加domain includeSubdomainstruearchive.ubuntu.com/domain并允许HTTPLifecycleBoundObserver相关崩溃伴随security日志java.lang.IllegalArgumentException: LifecycleOwner must be initializedW/securityLiveData.observe()在ActivityonCreate()中调用但super.onCreate()未执行完getLifecycle()返回null将observe()移到onStart()或使用viewLifecycleOwnerFragment中4.2 独家排查技巧三招锁定隐藏源头技巧一ADB Shell网络追踪当logcat无法定位时直接在设备上抓包adb shell su tcpdump -i any -s 0 -w /data/local/tmp/capture.pcap port 80 or port 443 # 复现问题后导出PC用Wireshark分析 adb pull /data/local/tmp/capture.pcapWireshark中过滤ip.addr 91.189.91.93查看HTTP请求的User-Agent字段。若显示Dalvik/2.1.0 (Linux; U; Android 12; Pixel 5 Build/SQ1A.220205.002)确认是App发起若为okhttp/4.9.3则指向Retrofit若为Mozilla/5.0可能是WebView。技巧二Gradle依赖树逆向执行./gradlew app:dependencies --configuration releaseRuntimeClasspath搜索91.189.91.93。曾有个案例implementation com.squareup.okhttp3:logging-interceptor:4.9.3的transitive dependency中okhttp的testImplementation模块包含http://91.189.91.93的测试URL虽不打包进APK但./gradlew test时触发security警告。解决方案是排除该模块implementation(com.squareup.okhttp3:logging-interceptor:4.9.3) { exclude group: com.squareup.okhttp3, module: okhttp-tests }。技巧三APK反编译验证用jadx-gui打开APK搜索91.189.91.93。若在classes.dex中找到说明已编译进字节码若只在resources.arsc中出现说明是strings.xml资源。更隐蔽的是BuildConfig类BuildConfig.DEBUG_URL可能被编译为http://91.189.91.93此时需检查build.gradle中的buildConfigField定义。实操心得我踩过的最大坑是androidx.appcompat:appcompat:1.6.1的AppCompatDelegate类中applyDayNight()方法会加载http://协议的资源用于夜间模式fallback在Android 12上触发security警告。解决方案不是降级而是重写AppCompatDelegate.setDefaultNightMode()在Application.onCreate()中预加载资源。5. 安全加固延伸从单点修复到体系化防护5.1 Android网络安全配置的进阶实践network_security_config.xml只是起点。真正的安全加固需分层实施传输层强制TLS 1.2禁用SSLv3/TLS 1.0。在OkHttpClient中val client OkHttpClient.Builder() .connectionSpecs(listOf( ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_3) .build() )) .build()应用层使用Certificate Pinning防中间人攻击。生成公钥哈希openssl x509 -in certificate.pem -pubkey -noout | \ openssl rsa -pubin -outform der 2/dev/null | \ openssl dgst -sha256 -binary | openssl enc -base64将结果填入network_security_config.xml的pin-set。数据层敏感数据如Token绝不存于SharedPreferences改用EncryptedSharedPreferencesval masterKey MasterKey.Builder(context) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .build() val encryptedPrefs EncryptedSharedPreferences.create( context, secure_prefs, masterKey, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM )5.2 开发流程安全左移策略将安全检查嵌入开发全流程Pre-commit Hook在.husky/pre-commit中添加#!/bin/sh git diff --cached --name-only | grep -E \.(java|xml|gradle)$ | xargs grep -l http://\|91\.189\.91\.93 echo ERROR: HTTP URL or hardcoded IP detected! exit 1Code Review ChecklistPR模板强制要求[ ] 网络请求URL是否通过BuildConfig或Resource注入[ ]network_security_config.xml是否覆盖所有域名[ ]WebView是否启用setJavaScriptEnabled(false)且禁用setAllowContentAccess(true)自动化扫描集成MobSFMobile Security Framework上传APK后自动检测硬编码凭证、不安全的WebView配置、过期证书等。我们设定阈值高危漏洞数0则阻断发布。5.3 运维视角的IP地址治理规范91.189.91.93这类基础设施IP应纳入企业IP白名单管理体系建立IP资产库用Excel维护IP地址 | 所属机构 | 用途 | 生效时间 | 负责人91.189.91.93条目注明“Canonical Ubuntu镜像仅用于CI/CD构建禁止App直连”网络层拦截在防火墙如iptables中添加规则阻止内网设备访问91.189.91.93:80/443仅放行CI服务器IPDNS重定向将archive.ubuntu.com解析到内网镜像站彻底隔离外部IP依赖。最后分享一个小技巧在build.gradle中定义ext变量统一管理URLext { BASE_URL_DEBUG https://dev-api.yourcompany.com BASE_URL_PROD https://api.yourcompany.com // 禁止定义HTTP URL } android { buildTypes { debug { buildConfigField String, BASE_URL, \${BASE_URL_DEBUG}\ } release { buildConfigField String, BASE_URL, \${BASE_URL_PROD}\ } } }这样BuildConfig.BASE_URL永远是HTTPS从源头杜绝security警告。我在三个项目中推行此规范硬编码问题归零且节省了80%的合规审计时间。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Genkit JS 智能体人机协同(Human-in-the-Loop)实战:用 Interrupt 暂停 Agent 轮次并在恢复点继续执行 2026/9/13 22:19:08

Genkit JS 智能体人机协同(Human-in-the-Loop)实战:用 Interrupt 暂停 Agent 轮次并在恢复点继续执行

Genkit JS 智能体人机协同(Human-in-the-Loop)实战:用 Interrupt 暂停 Agent 轮次并在恢复点继续执行 【免费下载链接】skills Agent Skills for Google products and technologies 项目地址: https://gitcode.com/GitHub_Trending/skills2…

阅读更多 →
Megatron-LM 首次训练实战指南:从最小分布式循环到 LLaMA-3 FP8 训练与数据预处理 2026/9/13 22:19:08

Megatron-LM 首次训练实战指南:从最小分布式循环到 LLaMA-3 FP8 训练与数据预处理

Megatron-LM 首次训练实战指南:从最小分布式循环到 LLaMA-3 FP8 训练与数据预处理 【免费下载链接】Megatron-LM Ongoing research training transformer models at scale 项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM 本文是 Megatron-LM…

阅读更多 →
Flink高级之侧输出流Side Output原理及代码实现:从OutputTag到多流分发 2026/9/13 22:19:08

Flink高级之侧输出流Side Output原理及代码实现:从OutputTag到多流分发

摘要:一条实时数据流里总混着正常、异常、迟到、需监控四类数据,传统 filter 方案要遍历 N 遍、逻辑散落 N 个算子;Flink 侧输出流(Side Output)用一次遍历完成多路分发。这篇文章拆透侧输出:从 1N 流模型、…

阅读更多 →
论文格式老被退回?格式错误的4步自查清单 2026/9/13 22:19:08

论文格式老被退回?格式错误的4步自查清单

论文格式被学校退回,是毕业季最常见的返工原因之一。与其一次次改完再交、再被退回,不如按一份固定清单逐项自查。这篇把格式错误拆成 4 个步骤:先定位退回原因,再按「整体版式 → 正文细节 → 引用著录 → 图表表格」四层逐项排查…

阅读更多 →
海底海参检测数据集介绍、下载及YOLO/VOC/COCO训练格式转换 2026/9/13 22:19:08

海底海参检测数据集介绍、下载及YOLO/VOC/COCO训练格式转换

海底海参完整数据集下载目录 同时包含三种主流标注格式:COCO JSON、VOC XML、YOLO TXT 海底海参检测数据集🌊:数据集介绍、下载📥 | 目标检测 | 水平框📌|原始图像✅|VOC标签✅ | COCO 标签✅…

阅读更多 →
Ingress NGINX 注解风险等级与作用域全解:annotations-risk 治理指南 2026/9/13 22:16:07

Ingress NGINX 注解风险等级与作用域全解:annotations-risk 治理指南

Ingress NGINX 注解风险等级与作用域全解:annotations-risk 治理指南 【免费下载链接】ingress-nginx Ingress NGINX Controller for Kubernetes 项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx 导读 Ingress NGINX Controller 通过 ngin…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞