V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  kuanat  ›  全部回复第 2 页 / 共 12 页
回复总数  233
1  2  3  4  5  6  7  8  9  10 ... 12  
153 天前
回复了 d0x0b 创建的主题 程序员 我至今仍感到羞愧的代码
大概十多年前约 2013 年前后,我写过很多用于设备追踪和用户识别相关的代码,那个时候收集用户隐私几乎是稀松平常的存在。现在相关的技术一般叫做指纹。

如果现在让我评价,我认为这些代码属于作恶性质的。丝毫没有对用户隐私的尊重,收集的信息数据最终都变成了商品。我有的时候会宽慰自己,即使我不做也有别人去做。这么说确实没错,但是放到十多年后的今天,别人可能只会抱怨环境恶劣,而作为曾经参与其中并推波助澜的一员,我会有种非常微妙的感受,就是恶心别人到头来终究恶心到了自己。

我个人认为在当时我这里“研发”的一些技术属于思想和实现都比较领先的,甚至有些技术在十年后依旧被广泛应用。

随便举个例子,当时大概是 iOS 7 的样子,我这里就在使用 url scheme 去判断用户安装了哪些应用。当然系统是不会提供这样的 api 接口了,让应用可以直接查询到哪些 url scheme 被注册。于是我就把当时软件商店按下载量拉回来主流应用并解包,获得相关的 url scheme 。通过这样的方式,可以在静默的状态下获得已知应用(有注册 url scheme )列表中应用的安装状态。一两年之后,iOS 才对访问 url scheme 的行为增加 UI 提示。

这个方法看起来很粗糙,但是它的思想是很深刻的,实际上行业内普遍应用都是好几年之后的事情了。甚至同样的技术手段,三年前还在用于桌面浏览器的指纹识别,桌面浏览器封堵相关漏洞也是很晚的事情。

说它粗糙是因为在十多年前,使用 url scheme 的应用数量有限,即便如此,十个应用即可获得 10bit 信息,16bit 就足够识别 65536 个用户了,这在当时已经超过了大多数用广告 sdk 的客户的用户数量。(实际的有效信息量会有损失,因为像微信支付宝这样的国民应用基本不具有可辨识度)

说它深刻是因为现如今所有的指纹技术,核心思想都是通过多渠道手段,采集在统计意义上独立的特征信息,大概 32bit 在实际应用中足够非常精准的识别了。当然现如今 app 根本不用这么麻烦,因为它们几乎都是随意采集。
主要问题是这个报错 `RPM: error: Unable to change root directory: Permission denied` 因为 dnf 是脚本,最终还要调用 rpm 的。dnf 的参数 `--installroot` 根据文档的描述是类似 chroot 之后 dnf 的,这个过程里 dnf 提前设置一下 rootdir 用到的配置文件等等。这个 chroot 的操作实际上是由 rpm 完成的。上面的报错是说 rpm 没有获得 CAP_SYS_CHROOT 这个权限导致的。(另外实际安装的时候也应该也需要 CAP_CHOWN 权限,也就是说单独给 chroot 权限不够,不过 chown 权限比较复杂,后面说)

同样因为 dnf 是个脚本,所以它只是机械地检查自身是否为 root 来判断自己能否执行。所以在不改动 dnf 的前提下,只能把 dnf 放到 root/uid0 去执行(不管是不是真的)。

fakeroot 的原理是通过 LD_PRELOAD 拦截并替换需要 root 权限的 syscall ,让被调用的程序认为自己是 root 。#9 失败的原因我猜测是 dnf 是个脚本,如果是 subprocess 的方式去调用 rpm ,那么 rpm 不会实际获得 chroot 权限。

顺便说一下 fuse 的原理,它是用户空间的实现,如果用 `-o fakeroot` 的话,相当于这个文件系统还是 ext4 ,原本所有操作都应该检查 ext4 里面的权限,开启 fakeroot 之后会强制可读可写,即 RWX 那一套不起控制作用。虽然名字也是 fakeroot 但不是一个实现方式。

所以理论上,只需要运行 `unshare -m -r dnf ...` 就可以创建一个 ns 让 dnf 以 root 权限运行,`-m` 创建 ns ,`-r` 将 ns 内的 uid 映射为 root 。

我个人不建议用上面的方式来运行,因为 `unshare -m -r dnf ...` 执行的是宿主机的 dnf 所以你需要传递一些 dnf 相关的参数,尽管 dnf 是做了很多工作,但还是有可能出问题。我更建议的方式是 `unshare -m -r chroot /path/to/fedora_rootfs dnf ...` 这样直接 chroot 进虚拟机系统,然后用虚拟机的 `dnf` 完成包管理。

另外实际上这样做还是太粗糙了,有几个问题:

- ns 里面环境变量不一定正确
- 一些特殊的 /proc 之类的文件系统不会绑定
- chown 需要额外的 uid/gid 映射表才能正常工作

所以一般会用 `podman unshare` 来解决上面这些麻烦。这个命令的实现来自于 `buildah unshare`,buildah 是 RH 系的构建系统,podman 也是 RH 开发的,所以就把这个功能用同样的方式实现了。

之所以要用 `podman unshare` 而不是直接用 `unshare` 是因为你自己处理 uid/gid 映射是比较麻烦且容易出错的。而 chown 的调用在 rpm 包中很常见,rpm 在安装包的时候会执行创建用户/组以及更改权限等相关的脚本。

当以非特权用户执行 unshare 的时候,只能够映射自身 uid 或者将自身映射为 fakeroot 。这个设计的初衷是防止 ns 内部冒充宿主的 root 以避免被漏洞提权。实现方式也比较简单粗暴,比如宿主机上 uid 范围是 0~65535 那么 ns 里面就是 100000~165535 这样,ns 里面的 0 对应的是宿主机上的用户。

所以实际上要满足 ns 中支持多 uid/gid ,那么宿主机上普通用户权限是不够的,但是又不希望以 root 权限创建 ns ,于是就通过具有 CAP_SETUID 权限的 /usr/bin/newuidmap 来实现。如果你要自己手动通过 `unshare` 来完成上述工作,就需要借助 newuidmap/newgidmap 。
161 天前
回复了 gesse 创建的主题 程序员 讨论一个 UDP 问题,关于监听。
如果是 connected 可以通过 UDPConn.LocalAddr() 获得,如果是 unconnected 要通过 ReadMsgUDP 的 oob 信息获取,底层实现应该还是 IP_PKTINFO 。

如果嫌麻烦可以每个 ip 对应一个实例或者 goroutine ,这样就知道本地绑定的 ip 了。
看起来是 bug 。

F40 changeset 里面有一些关于 NM 的改动,然后看打包情况 F40 现在是 1.46 ,而 F39 是 1.44 ,可能是中间某个版本引入的。

这个直接向上游 NM 反馈可能比较麻烦,可以试试先向 Fedora Bugzilla 报一下 bug 试试。
@bigbigeggs #11

你没有理解我的意思,我是说当你的设计目标是千万级的时候,这些优化一点都不重要。

当你考虑做成比如说十亿级别服务的时候,瓶颈就不在什么 hash 算法这些你关注的细节了。

过早优化是万恶之源。
假设 URL 的最大长度是 2KB ,一千万( 10M )条数据占用的内存不过 20GB 而已。
167 天前
回复了 XuYijie 创建的主题 程序员 接口加密问题
@XuYijie #18

可能是比较机械地执行等保规定吧……既然这样的话,按照对面的要求执行就是了。

如果直接用非对称加密,你只需要拉取公钥。如果用对称加密,你一样要拉取公钥,对称加密的密钥肯定是用非对称公钥加密保护一起传回去的。

不论哪种情况你都不需要保存私钥。
167 天前
回复了 XuYijie 创建的主题 程序员 接口加密问题
#3 @soar0712 说的就是标准做法。

现在不明确的是为什么要加密,防的是谁。谁让你这么干就问他,这么干的目的是什么,只有这么一种实现方式么,这么做能抵御哪些攻击。

提这个需求的大概率不懂,所以你也会跟着迷糊。你也可以试着思考一下,然后再过渡到为什么要存密钥,有没有必要存密钥,如果有必要存到哪里的问题。

当然我个人的意见是前端针对请求参数和返回值“加密”是没什么意义的(除非这个网页应用就是提供 e2e 加密的),搞“签名”还可以防机器人。
@crsmk01 #13

教育用户的成本比起开发一个诊断程序高太多太多了,这还不算技术跟客户沟通。这里的傻瓜化就是真把客户当傻瓜,我们甚至连压缩包都不发,就是直接发可执行程序下载链接。客户双击运行看完提示就万事。但是后来发现浏览器报可执行文件警告(包括国产魔改浏览器的非安全文件),还有 windows 自己的一个什么解锁。后来被迫买证书签名完事。

实际上吧,很多时候搞完这么一套,客户那边就没什么反馈了。因为多数网络问题都是临时性的,说不定什么时候就好了。
虽说标题里是找傻瓜工具,看正文这事解决起来可不是提供傻瓜工具就可以的。

我之前做过的项目里有过类似的需求,不清楚你这是什么情况,我就随便一说。

如果是客户端应用,最好开发自诊断模块,可以通过比较复杂的方式开启,也可以编译成特定版本。如果是 web 应用,可以考虑把诊断模块单独做,遇到问题的时候就发给客户运行。

这个诊断模块可以是自动上报的,如果客户有合规需求也可以生成诊断输出。记得做好鉴权,这种接口也要和线上生产接口一样对待,二进制程序发出去就控制不了了。不开玩笑,我见过异常的诊断程序一天刷了存储后端八万多个文件的事情……

当然这并不是说这个诊断应用就要集成一个抓包模块,主要靠基于日志的推理。把你自己代入到客户的位置上,你会做哪些排查,比如先采集系统环境,之后 ping 看网络通不通,再看 dns 解析是否正确,接着看 tcp 是否能连接,http 是否有反馈等等。所以我这边之前做的诊断程序就是一个执行脚本的工具,用户执行的时候会输入一个技术支持代码,其实就是拉取预设好的诊断脚本。

抓包这个事情除非有技术支持上门,我是不推荐的。一般来说,只有非常非常小概率才必须依赖抓包解决问题。
1. 不清楚你的使用场景,从不信任客户端的角度上说,单独在客户端做限速是可以被轻易绕过的。考虑一下变速齿轮,客户端获取到的系统时间是不可信的。

2. 看你的描述,应该是服务器出口流量分配的策略。比较 naive 的实现有可能在用户不饱和的时候难以有效利用带宽。

3. 限速模块尽量与主逻辑解耦,可以把限速委托给系统或者平台,比如 tc 配合防火墙,或者前置反代等等。主要是界定限速的目标是产品意义上的用户,还是软件意义上的客户端,限制来源可以有包级别,链接级别以及 session 级别等等。

4. 比较简单的限速策略容易在客户端和服务器端之间产生尖峰流量(锯齿状),不适合流媒体等场景。需要平滑速率曲线需要的不是限速( throttling )而是流量整形( traffic shaping )。
1. Pixel 设备的网络锁( carrier lock )的验证是通过 Google 服务器的。

2. 安卓设备本地记录这个状态是通过一个名为 get_unlock_ability 的标志位。这个标志位位于受 TEE 保护的存储区域。

3. 系统设置里的 oem unlocking 选项受前述标志位影响,标志位为 0 的时候 oem unlocking 就是灰色的。

4. 系统设置里的 oem unlocking 选项开启时执行的动作没有二次校验。

5. Pixel 软件里涉及 get_unblock_ability 的代码仅存在于 oobconfig 中( oob 即 out-of-box ,一个初始化时运行的组件),只会从 0 写为 1 ,已经为 1 就不管了。

综合以上 1234 ,在不真正解锁网络锁的前提下,只需要系统级漏洞就可以解 oem unlocking 灰色锁。只要解锁一次,就再也不会变灰。基本上每个版本都有这么几个漏洞,这些漏洞离 root 差得远,但是把 ui 开关打开是够用了。


PS

咸鱼商家的软件就是 usb 重定向,与实际解锁过程无关。

咸鱼上大部分都是漏洞解,并没有解除网络锁,只是解了这个灰色锁。

特解某型号某运营商的一般是线下和上游走私商家合作,后门解锁,直接把解锁请求发到 Google 那边。这种线上基本见不到。
168 天前
回复了 0o0O0o0O0o 创建的主题 分享创造 vaultwarden 备份思路之再也不改版
@ysmood #32

哈哈我一直在用你写的 rod ,非常棒!
169 天前
回复了 ChristopherY 创建的主题 程序员 怎么样快速解析好几个 G 的 pcap 文件
@playboy0 #29

流量来源是分光设备,旁路直接进服务器的光口网卡。什么都不用配置,网卡开启 promiscuous 混杂模式抓包就行了。端口镜像应该一样的道理。


这个项目是挺久之前的了,某集团安全审计相关,要做全协议流量分析。内部接入比较复杂,有类似 PPPOE/PPP 之类的认证,VLAN 既有二层也有三层。所以直接从出口分光出来做的。

这个事情本身不是我负责的,我就是去救火的。因为这个事情后来又做了针对某些协议的 DPI ,这玩意后来对外好像卖了接近一千万……

原本有个 DPDK 的方案,是很早之前从别的地方采购的,没人能维护。配套服务器是双路 E5 ,核心倒是多,只是频率很低,系统又是 CentOS 7 。基本上就是抱着死马当活马医的想法,姑且用 Go 一试。

系统太老了不想维护,所以 PF_RING 指望不上,就拿 AF_PACKET 替代了,实际测试下来没啥问题。这个做到后面发现 AF_PACKET/MMAP 其实和 PF_RING 原理几乎一样的。如果现在做的话,可能都是用 AF_XDP 了,性能估计还能翻番。

当时还用的是 google/gopacket 而不是后来有人维护的 gopacket/gopacket 。不过影响不大,整个库的基础功能很完善了,除了当时没有的几个协议做了一下解析实现。


技术上这个只要懂原理的话没什么难度,内核里用 BPF 去抓包,MMAP 内存在内核和应用之间共享,AF_PACKET 设定好扇出,把网卡的数据写入 MMAP 的内存,用户空间的应用通过 ZeroCopy 方式读就可以了。核心部分代码可能没有一百行。
170 天前
回复了 0o0O0o0O0o 创建的主题 分享创造 vaultwarden 备份思路之再也不改版
稍微跑个题,既然变更历史那么重要,有没有考虑过用 git 和文本文件做密码管理呢?

使用 git 你可以天然记录变更历史,同时可以任意 self host 或者利用各种公有设施实现分布式备份。

缺点是文本文件要加密。那就再套一层 gpg 加密好了,git 管理 gpg 加密后的文本文件。

剩下的事情就是写个 wrapper 把这个操作简化掉。

如果你认为这个思路合理的话,可以参考 pass - the standard unix password manager

https://www.passwordstore.org/

我已经用了十多年了,在各种平台都有开源可自编译的客户端或命令行工具。
170 天前
回复了 CC11001100 创建的主题 分享发现 CMCC 认证绕过 POC
@CC11001100 #2

盲猜一下,估计是那个认证服务器不在内网里,所以要给一段时间让你能够打开那个认证页面,2016 年那些系统还不成熟。

一般这种 captive portal 在出口处的防火墙默认阻止所有 ip 访问(非 mac ),通过认证的就让防火墙放行。然后一般为了减轻防火墙负担,已经建立的连接后续数据包就直接放行了。

反复 release/renew 让你的设备在系统看来是新设备加入,清空了之前防火墙记录,你的访问( dns 请求,发起连接)能在系统预设的时间里发起,流量就能通过。

现在的系统基本上都是绑定到 mac ,比如星巴克用的,你可以跨店免认证接入。再就是认证服务器处于内网,通过旁路连接到中央计费后台。这样就没办法流量偷跑了。
170 天前
回复了 CC11001100 创建的主题 分享发现 CMCC 认证绕过 POC
厉害啊哈哈
170 天前
回复了 ChristopherY 创建的主题 程序员 怎么样快速解析好几个 G 的 pcap 文件
@playboy0 #26

老 E5 单核 2G ,单个核心处理能力最高 100k pps 左右,包含业务逻辑。单纯解析时间中位数在 20us 左右。

由于整个内核 AF_PACKET 扇出数量和并发线程数是一致的,加上解析过程是 zerocopy ,几乎不会触发 gc ,内存占用没有印象了,应该非常稳定。
170 天前
回复了 ChristopherY 创建的主题 程序员 怎么样快速解析好几个 G 的 pcap 文件
https://github.com/google/gopacket

我之前在 go 经验的帖子里写过,这个库配合一些手动内存管理的技巧,在 10Gbps 网络上做实时处理没什么问题。

如果是 pcap 离线文件,直接按照示例写就好了。
171 天前
回复了 oaa 创建的主题 分享创造 通过 pane option 来 save/load 你的 tmux session
这个是不是考虑方向偏了?我觉得有必要明确区分 layout/session ,恢复 layout 是个容易的事情,但恢复 session 不是个很好的方向。

我个人的意见,session 很廉价,完全可以预先开很多 session (习惯通过 systemd service 管理),无论是 ssh 还是本地连接的时候直接 attach 到对应的 session 里面。

对于非重启环境,直接 detach 就可以了。对于重启环境,没想到要恢复 session 的应用场景。
1  2  3  4  5  6  7  8  9  10 ... 12  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1115 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 27ms · UTC 18:58 · PVG 02:58 · LAX 10:58 · JFK 13:58
Developed with CodeLauncher
♥ Do have faith in what you're doing.