聊一聊日志保护的相关思路

最近在研究隐私合规的政策,发现有一条叫
《TTAF 077.14-2021 APP收集使用个人信息最小必要评估规范 应用日志信息》

发现对日志输出有相应要求,不能明文输出包含个人信息的日志到控制台。

针对这个要求,想到了如下三个方案,但是都有一些弊端,希望各位大佬可以指点一下:

方案一:
利用git hooks,在pre-push的阶段扫描代码,发现存在print和NSLog等函数即报错,停止提交操作。
优点:可以从根源上杜绝开发人员提交包含日志输出的代码,提高代码执行效率
缺点:git hooks好像无法自动更新(可能是我太菜了),如果要更改规则比较麻烦,而且容易被开发怼。

方案二:
使用fishhook去拦截相应的NSLog和print函数,然后内部不执行任何操作。
优点:全局直接拦截,随便开发阶段怎么使用
缺点:首先稳定性是个大问题,可能会出现奇怪的崩溃。而且项目中大量使用Swift,Swift的print函数hook不到(可能是我太菜了)

方案三:
使用dup2重定向日志输出到/dev/null
这个是目前用的临时方案。
优点:全局直接拦截,随便开发阶段怎么使用
缺点:日志只是不输出到控制台了,但是依然会走所有print或者NSLog的逻辑,对性能没有任何提升。

#import <sys/uio.h>
#import <stdio.h>

int fd = 0;
fflush(stdout);
fflush(stderr);
setvbuf(stdout,NULL,_IONBF,0);
fd = open("/dev/null", (O_RDWR | O_CREAT), 0644);
if(-1 == fd) {
    printf("\n open() failed with error [%s]\n", strerror(errno));
} else {
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    printf("Here is dll init, redirect stdout and stderr to logfile\n");
}

至于为什么不用公用的管理类去控制打印日志。。其实这个类很早就有了,也一直在推广,但是开发还是习惯于直接一个print(提交代码时又不删),毕竟需要多import一个头文件,使用还是很繁琐的。

1 个赞

我之前是在 swiftlint 里做了限制,带 print,debugPrint 等函数直接 ci 打回了,强制用内部的 logger。污染 console 罪大恶极 :rage:
日志该留还是得留,分锅时候必须得有,不要明文就行了。

这个可以用 @_export import

为什么不能三者结合起来做呢,合起来就是一整套的方案了啊,方案一是CICD阶段,做到源头的管控,但是问题是大型应用中有很多三方库不是开源的,方案二解决闭源库的问题,hook输出监控日志,有问题的找对应的部门改或者评估,第三步兜底如果还是有漏过的,再通过重定向去兜底。这个就是一个完整的SDLC流程了,有些事情不一定非得靠技术才能解决

:money_mouth_face:
等我试试的

问题在于很多时候最大的阻力来自于开发不愿意搞 :no_mouth:。。

哈哈哈哈,是的,所以要看安全团队在公司内的地位和外部压力,现在国内厂商隐私安全这块应该是比较高的优先级吧,国家管的这么严了。如果开发不愿意搞是不是可以尝试着找领导沟通下去推动,不然两边就一直是隔离的,他们不理解我们,毕竟这不是他们的kpi

之前有分析过某省健康码,登录人脸识别前身份证明文打log的(
语言/框架为啥不直接提供一个日志过滤钩子呢

:rofl:
这个其实是开发规范的问题,讲道理NSLog是输出错误日志的函数,因为NSLog会写入系统错误日志数据库。但是开发习惯了用NSLog打印所有日志。
https://developer.apple.com/documentation/foundation/1395074-nslogv?preferredLanguage=occ
第一句话就写了:
Logs an error message to the Apple System Log facility.