MYJPJ移动应用安全审计报告

善意声明

作为一名怀着赤诚之心的安全研究员,我谨在此郑重声明:本次安全审计的唯一目的是帮助改进系统安全性,为保护用户数据安全尽一份力。报告中所有敏感信息均已进行脱敏处理,以防被不法分子利用。我始终秉持"善意披露、负责任报告"的原则,希望通过专业的漏洞发现和及时报告,协助开发团队尽快修复安全隐患。在此过程中,我严格遵守相关法律法规,绝无任何破坏或恶意利用的企图。

衷心期待通过白帽黑客与开发团队的良性互动,共同为政府和企业的信息安全保驾护航,为广大用户筑起更坚实的数据保护屏障。

严重性等级: CRITICAL (CVSS 9.1)

高危漏洞 PDPA合规

漏洞报告提交证明

官方邮件提交记录

发送时间: 2025年3月24日

接收方: aduan@jpj.gov.my

主题: [安全漏洞报告] MYJPJ移动应用数据泄露风险通报

提交截图证明

漏洞报告提交邮件截图

声明

本漏洞报告已通过官方渠道提交至马来西亚陆路交通局(JPJ)。作为一名怀着善意的安全研究员, 我希望通过及时报告这些安全问题来帮助改进系统安全性,保护用户数据安全。这份工作完全出于善意, 绝无任何恶意破坏或利用的企图。希望通过负责任的漏洞披露方式,能够帮助JPJ尽快修复这些安全隐患。 在发现政府系统漏洞时需要格外谨慎和负责任。我完全理解马来西亚同胞们对此类披露可能持有疑虑,但我希望能以最大的诚意说明:发现并报告这个漏洞的唯一目的,是为了防止不法分子抢先发现并加以利用。作为一名关心马来西亚网络安全的研究员,我深感有责任通过正当渠道向JPJ报告这一问题。 我坚信JPJ作为负责任的政府部门,一定会认真对待这个安全隐患并采取必要的补救措施。毕竟在这个数字化时代,保护公民的个人数据安全是政府的重要职责。我真诚地希望通过这次善意的漏洞披露,能为提升政府系统的安全性贡献一份力量,共同维护马来西亚公民的数据安全。

魏部长办公室邮件提交记录

发送时间: 2025年3月25日

联系方式来源: parlimen.gov.my

接收方:weekasiong@yahoo.com

主题: [紧急] MYJPJ移动应用严重安全漏洞通报

跟进原因: JPJ未在24小时内对首次报告作出响应

魏部长办公室邮件提交截图

向部长办公室提交漏洞报告邮件截图

由于事关重大公众利益,且初次报告未获及时回应,特向魏部长办公室提交跟进报告。

CNVD漏洞提交记录

已提交至国家信息安全漏洞共享平台(CNVD)

漏洞编号:CNVD-C-2025-176294

漏洞复现证明

环境配置文件直接暴露在公网的复现截图

环境配置文件泄露漏洞截图
高危漏洞

技术证据链分析

个人信息暴露矩阵

字段名
数据类型
PDPA分类
泄露途径
Token API访问令牌 系统凭证 日志输出
ID API用户标识 系统标识符 日志输出
PASSWORD API密钥/JWT令牌 认证凭证 日志输出
AUTH BEARER HTTP认证令牌 访问凭证 请求头部
noic 车主身份证号 敏感个人信息 API响应
nokp 身份证号码 敏感个人信息 API响应
nokenderaan 车牌号码 车辆信息 API响应
jnsBody 车身类型 车辆信息 API响应
kodKegunaan 车辆用途 车辆信息 API响应
birthDate 出生日期 敏感个人信息 API响应
addres1 地址第一行 个人地址信息 API响应
postcode 邮政编码 位置信息 API响应
city 城市 位置信息 API响应
state 州属 位置信息 API响应
image 用户照片 生物识别信息 API响应
qrCode 用户二维码 身份验证信息 API响应
敏感数据日志示例
                
                
21:31:02.047125+0800  kernel  App Store Fast Path -> /Runner.app/Frameworks/webview_flutter_wkwebview.framework/webview_flutter_wkwebview  
21:31:02.129863+0800  kernel  App Store Fast Path -> /Runner.app/Frameworks/Flutter.framework/Flutter  
21:31:02.612610+0800  Runner  flutter: Permission granted: true  
21:31:03.221663+0800  Runner  flutter: false  
21:31:03.729068+0800  Runner  flutter: {"status":"00","message":"Set Player ID Success"}  
21:31:04.139558+0800  Runner  flutter: Final Push status check:  
21:31:04.139616+0800  Runner  flutter: Opted in: true  
21:31:04.139645+0800  Runner  flutter: Token: {敏感信息已脱敏}  
21:31:04.139697+0800  Runner  flutter: ID: {敏感信息已脱敏}  
21:31:04.139739+0800  Runner  flutter: PASSWORD: {敏感信息已脱敏}  
21:31:31.972259+0800  Runner  flutter: 200  
21:31:43.021980+0800  Runner  flutter: {Content-Type: application/json; charset=UTF-8, Accept: application/json, Authorization: Bearer {敏感信息已脱敏}, Accept-Language: ms}  
21:31:43.239563+0800  Runner  flutter: 200  
21:31:43.239747+0800  Runner  flutter: {"noic":"{敏感信息已脱敏}","status":"01","status_message":"NOT FOUND","saman":[]}  
21:32:03.509769+0800  Runner  flutter: error data from api  
21:32:03.663134+0800  Runner  flutter: {nokenderaan: {敏感信息已脱敏}, jnsBody: MKR, kodKegunaan: AB, nokp: null, share: 0}  
21:32:05.535017+0800  Runner  flutter: true  
21:32:11.995522+0800  Runner  flutter: {Content-Type: application/json; charset=UTF-8, Accept: application/json, Authorization: Bearer {敏感信息已脱敏}, Accept-Language: ms}  
21:32:13.335059+0800  Runner  flutter: 200  
21:32:13.336601+0800  Runner  flutter: response body : {"connStatus":200,"user":"{敏感信息已脱敏}","nokp":"{敏感信息已脱敏}","status":"{敏感信息已脱敏}","message":"TRANSACTION SUCCESSFUL","nationality":"MALAYSIA","birthDate":"{敏感信息已脱敏}","refNo":"{敏感信息已脱敏}","addres1":"{敏感信息已脱敏}","addres2":"{敏感信息已脱敏}","addres3":"{敏感信息已脱敏}","postcode":"{敏感信息已脱敏}","city":"{敏感信息已脱敏}","state":"{敏感信息已脱敏}","country":"MALAYSIA","image":"{敏感信息已脱敏}"}  
21:32:13.377635+0800  Runner  flutter: {"connStatus":200,"msg":"Success","lesenCDL":"1","lesenPDL":"0","lesenLDL":"0","lesenVOC":"0"}  
21:33:02.038156+0800  Runner  flutter: {"connStatus":200,"result":[{"response_code":"GLB000000I - Transaksi Berjaya","nokp":"{敏感信息已脱敏}","nama":"{敏感信息已脱敏}","noKenderaan":"{敏感信息已脱敏}","effectiveDate":"{敏感信息已脱敏}","expiredDate":"{敏感信息已脱敏}","lkmAmount":"90.00","kodTransaksi":"{敏感信息已脱敏}","kodKegunaan":"AB","bodyType":"MKR","kodCaw":"0116103","kodSekuriti":"{敏感信息已脱敏}","region":"SEMENANJUNG","cc":"{敏感信息已脱敏}","jnsKegunaan":"PERSENDIRIAN","qrkod":"{敏感信息已脱敏}"}]}  
21:34:07.660425+0800  Runner  flutter: {"status":200,"icno":"{敏感信息已脱敏}","vehicleRegno":"{敏感信息已脱敏}","message":"Tiada rekod senarai hitam."}  
21:34:23.682576+0800  Runner  flutter: {"statusSaman":[{"status":"11","message":"Tiada Saman Yang Boleh Dibayar|No Summons Can Be Paid","totalSummon":"0"}],"senaraiSaman":[]}  
                
              

应用信息

应用名称: MYJPJ Mobile App

开发框架: Flutter

应用类型: 马来西亚陆路交通局(JPJ)官方移动应用

免责声明

本安全测试报告仅用于帮助改进应用程序安全性,严格遵守马来西亚《个人数据保护法》(PDPA)的规定。

安全研究承诺:
  • 不会对应用程序进行任何破坏性操作
  • 不会恶意利用或泄露测试过程中发现的任何敏感信息
  • 遵守负责任的漏洞披露原则
  • 及时向开发团队报告发现的安全问题
  • 协助开发团队修复安全漏洞

本测试完全遵守马来西亚PDPA关于个人数据收集、使用和保护的相关规定。

漏洞影响链

数据泄露影响链示意图

合规性违规

  • PDPA 2010 第7原则(安全原则)
  • PDPA 2010 第9原则(保留限制原则)
  • OWASP Mobile Top 10 M2/M3

数据暴露统计

身份凭证 4处
个人信息 12类
API端点 3个

技术分析详情

测试方法

使用工具:

  • adb logcat - 用于Android日志分析
  • Flutter日志分析工具
  • Wireshark - 用于网络流量分析

安全问题发现

开发团队必要行动

严重警告:应用程序不得在控制台打印任何敏感数据!

问题描述

该应用程序的开发团队在日志处理方面存在严重的安全隐患。通过分析日志发现,开发者直接将用户的敏感个人信息打印到控制台日志中,包括但不限于:

  • 用户身份证号码
  • 车牌号码
  • 完整的家庭住址信息
  • 个人联系方式
  • API访问密钥和认证Token
  • Bearer Token等授权信息

潜在风险

  • 个人身份信息被盗用
  • 用户隐私数据泄露
  • API凭证被恶意使用
  • 违反数据保护相关法律法规

建议措施

  • 移除所有包含敏感信息的日志打印
  • 仅保留必要的系统运行状态日志
  • 对现有日志进行安全审计
  • 实施严格的日志记录策略
  • 加强开发团队的安全意识培训

🔍 安全研究员观点

"这个应用程序绝对是安全漏洞的集大成者..."

关键问题

  • 开发团队对安全性概念严重缺失
  • 完全无视用户隐私保护原则
  • 违反多项PDPA法律条款
  • 急需立即整改以避免更大的安全隐患

技术证据链分析

1. 日志分析详情

分析方法

  • 使用adb logcat进行日志捕获
  • Flutter日志分析
  • Wireshark网络流量分析

API凭证泄露

默认 21:31:04.139645+0800 Runner flutter: Token: {敏感信息已脱敏}
默认 21:31:04.139697+0800 Runner flutter: ID: {敏感信息已脱敏}
默认 21:31:04.139739+0800 Runner flutter: PASSWORD:{敏感信息已脱敏}

HTTP认证令牌泄露

{
  "Content-Type": "application/json; charset=UTF-8",
  "Accept": "application/json",
  "Authorization": "Bearer {敏感信息已脱敏}",
  "Accept-Language": "ms"
}

个人敏感信息泄露

{
  "connStatus": 200,
  "user": "{敏感信息已脱敏}",
  "nokp": "{敏感信息已脱敏}",
  "nationality": "MALAYSIA",
  "birthDate": "{敏感信息已脱敏}",
  "addres1": "{敏感信息已脱敏}",
  "postcode": "{敏感信息已脱敏}",
  "city": "{敏感信息已脱敏}",
  "state": "{敏感信息已脱敏}"
}

车辆信息泄露

{
  "noKenderaan": "{敏感信息已脱敏}",
  "effectiveDate": "{敏感信息已脱敏}",
  "expiredDate": "{敏感信息已脱敏}",
  "lkmAmount": "90.00",
  "bodyType": "MKR",
  "region": "SEMENANJUNG",
  "jnsKegunaan": "PERSENDIRIAN"
}

PDPA违规总结

  • 违反第7条原则:未能保护个人数据安全
  • 违反第9条原则:不当保留敏感信息
  • 违反数据最小化原则:日志中包含过多个人信息
  • 违反安全存储原则:明文显示敏感数据

1. 认证凭证泄露

21:31:04.139739+0800 Runner flutter: PASSWORD:{隐私数据}
21:31:43.021980+0800 Runner flutter: Authorization: Bearer {隐私数据}

攻击向量

  • 逆向工程提取凭证
  • 中间人攻击(MITM)
  • 日志文件分析

潜在影响

  • 完整账户接管
  • API服务滥用
  • 数据篡改风险

2. 个人信息暴露矩阵

字段名 数据类型 PDPA分类 泄露途径
Token API访问令牌 系统凭证 日志输出
ID API用户标识 系统标识符 日志输出
PASSWORD API密钥/JWT令牌 认证凭证 日志输出
AUTH BEARER HTTP认证令牌 访问凭证 请求头部
noic 车主身份证号 敏感个人信息 API响应
nokp 身份证号码 敏感个人信息 API响应
nokenderaan 车牌号码 车辆信息 API响应
jnsBody 车身类型 车辆信息 API响应
kodKegunaan 车辆用途 车辆信息 API响应
birthDate 出生日期 敏感个人信息 API响应
addres1 地址第一行 个人地址信息 API响应
addres2 地址第二行 个人地址信息 API响应
addres3 地址第三行 个人地址信息 API响应
postcode 邮政编码 位置信息 API响应
city 城市 位置信息 API响应
state 州属 位置信息 API响应
refNo 交易参考号 交易信息 API响应
image 用户照片 生物识别信息 API响应
qrCode 用户二维码 身份验证信息 API响应

安全加固方案

立即措施

class SecureLogger {
  static void log(dynamic data) {
    if (kReleaseMode) {
      final sanitized = data.toString().replaceAllMapped(
          RegExp(r'\b(nokp|token|password)=[^&]*'), 
          (m) => '${m[1]}=[REDACTED]');
      debugPrint(sanitized);
    }
  }
}

长期方案

证书绑定

<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">api.myjpj.gov.my</domain>
    <pin-set>
      <pin digest="SHA-256">BASE64_HASH</pin>
    </pin-set>
  </domain-config>
</network-security-config>

安全审计清单

日志安全检查项

优先级:高
  • 移除所有包含个人信息的日志打印
  • 实现安全的日志记录机制
  • 定期清理日志文件
  • 对日志访问进行权限控制
  • 加密存储敏感日志信息

数据安全检查项

优先级:关键
加密措施
  • 使用安全的加密算法保护敏感数据
  • 实现安全的密钥管理机制
数据管理
  • 定期更新加密密钥
  • 安全删除临时文件和缓存

网络安全检查项

优先级:高
防护措施
  • 启用SSL证书固定
  • 实现请求签名机制
访问控制
  • 防止中间人攻击
  • 限制API访问频率
监控告警
  • 监控异常网络活动
  • 实时安全告警

合规性分析

PDPA 2010违规项

第7条原则(安全原则)违规

未能保护个人数据免受未经授权访问

第9条原则(数据保留)违规

敏感信息在日志中的不当保留

联系方式

安全研究员信息

姓名: 钟智强

职位: 高级安全研究员 | 高级全栈开发工程师 | 计算机视觉专家

电子邮件: johnmelodymel@qq.com

微信: ctkqiang

响应时间承诺

  • 紧急漏洞问题:24小时内响应
  • 一般技术咨询:48小时内回复

首选沟通渠道

1. 电子邮件(安全加密通信)

2. 微信语音/视频会议