灵光 · 灵光 · · 国科智飞 Gavin
信息流控制:锁没错,秘密不在屋里
潼县有间没有窗的屋,二十一年没出过一张纸,府城书肆却卖了三年潼县的密案。一个关于「信息流控制」的寓言。
潼县衙门最后面有一间屋,没有窗。
墙是双层的,中间夹一层夯土;门是榆木包铁,一把铜锁,锁眼比小指还细。钥匙只有一把,挂在誊录吏陆砚的腰上,系一根磨得发亮的油绳,睡觉也不解。
规矩是上任知县定的,用了二十一年:凡标「密」字的卷宗,只在这一间屋里抄。原稿抄完,就地焚于铁盆;灰烬和入水缸,第二日泼入院中花圃。誊本不出门,笔墨纸砚不出门,连抄剩的纸角,也要在盆里烧掉。衙门口的照壁上刻着六个字:密不出此屋。
二十一年,考绩上,历任知县都写着同一句:本县密件,滴水不出。
韩知县是去年秋天到任的。他不信考绩,信自己的眼睛。上任第三个月,他把陆砚叫来,当面验了三件事。
验房。 他绕着屋子走了一圈:数窗,零;数门,一。门关上,自己站在屋里看墙缝透不透光。没有。
验人。 查门簿:二十一年,进过这屋的共十一人,全是历任知县,全是来验房,每人一次,待不到一炷香。
验纸。 库里领纸有编号,每刀一百张;领多少、用多少、烧多少,陆砚自己记一本《纸账》。他抽了三个月的账,加减对得上,一张不差。
他在验单上写了四个字:密不漏。
第二年开春,府城来了一个人,是臬司衙门的幕僚,姓卫,带着一本薄薄的册子,从府城书肆上买来的。封皮上一行小字:潼盐案略。
韩知县翻开第三页,手心就凉了。那是去年三月本县查的一桩私盐案,卷宗里记着某乡绅在码头接货的时辰、船号、经手人。这一段,除了他自己和陆砚,不该有第三个人知道。
「这册子,书肆卖了多少?」
「卖了一年多。不是一本,是三本。」
回衙,他不升堂,直接去了那间屋。门开着,陆砚正在抄,铁盆里一堆灰,水缸里一层浮渣。
「这屋里二十一年没出过一张纸,」韩知县把册子放在桌上,「可府城的书肆卖了三年潼县的案子。你告诉我,字是怎么出去的。」
陆砚看了看册子,脸色白了一下,又稳住了:「大人,卑职这屋,确实一张纸也没出去。您验过的。」
「我知道我验过。」韩知县说,「我现在问的不是纸。」
那一夜,两个人一句一句地捋,捋出四条路。
墨。 这屋用的墨不是县里的,是府城聚墨斋的「松烟重胶」——县里写不了那么细的小楷。每季送墨,陆砚要签一张《领墨单》,单上按规矩要写:本季抄某案、某案、某案,共用墨几锭。不写案由,账房不批。于是墨商每季都知道潼县衙在抄哪几桩案子;二十一年下来,他知道的比历任知县都全。
校。 誊本抄完要校。衙门里识字够校小楷的只有陆砚一个,自己校自己,校不出来。二十年前便定了一个「变通」:誊本用布包了,送到城外驿站,由驿里的誊校老佟过一遍,当天送回。誊本在驿站的桌上摊开过;摊开的时候旁边坐着谁,陆砚不知道,老佟也不知道——他只管对字。
回单。 校完要写回单,不抄全文,只写四样:卷由、字数、校者、有无涂改。三份,一份留驿,一份随驿递送府城,一份县内存档。驿递要有由头,不然府城不收。于是府城的架阁库,每个月都收到一份潼县密件的清单:哪一桩、多少字、几时校完。
抄目。 陆砚自己记《抄目》,一月一册,随驿递送府城备查,上面是一行一行的卷名。
四条路,每一条都合规,每一条都有旧例,每一条都只走了一小段——一段到墨商,一段到驿站的桌上,一段到府城的架阁库。没有一条,是把整卷卷宗送出去的。
韩知县坐在那间没有窗的屋里,看着铁盆里的灰,很久没说话。他忽然明白自己验错了什么。
他验的是「东西有没有离开这间屋」。屋子是死的,墙是死的,纸是数的——这些东西二十一年都在原处,一张不少,一锭不缺。他验得对,验得极准。
可那卷宗里的「密」,不在纸上,不在屋里,也不在那把锁上。
它在路上。
它被拆成四份,分别走了四段路。走的时候,每一段都有名目、都有旧例、都签了字。合起来,一个在府城书肆里翻册子的人,能把码头那段时辰、船号、经手人,拼回八成。
他把钥匙从陆砚腰上解下来,放在桌上:「锁没错。是我一直以为,秘密是锁在屋里的东西。」
他顿了顿:「秘密不是东西。秘密是路。」
后来韩知县改了三件事。《领墨单》不写案由,只写锭数——账房照批,墨商再不知道潼县在抄什么。校不再送驿:他自己学小楷,每卷抄完,陆砚念,他看,两个人在屋里校,校完当场焚;这一条他守了两年,后来调任,把它写进了《县衙则例》。回单只写字数与有无涂改,不写卷由;驿递另附一张空由头,不涉案情。
书肆上,潼县的册子,此后十二年没再出现过。
概念:信息流控制
一句话:保密性不是「东西存放在哪」的属性,是「东西沿哪些路径走、每一段谁能读」的属性。
1976 年,Dorothy E. Denning 在《ACM 通讯》上发表《A Lattice Model of Secure Information Flow》,把「谁能读什么」形式化成一张晶格:每个主体有等级,每个客体有等级,规则不落在仓库上,落在每一次读写操作上。它的前身是 1973 年 Bell 与 LaPadula 为 MITRE 做的多级安全模型——「不可上读、不可下写」,上行下行的方向,就是流的方向。
这套思路在现代工程里叫污点分析 / 动态信息流追踪(taint tracking,Newsome & Song 2005):一个值被打上标记,它流到哪儿,标记跟到哪儿。危险的不是它被存在哪,是它被算进了哪个输出。理论上最强的判据叫非干扰性(noninterference,Goguen & Meseguer 1982):高等级的操作,不许对低等级可观测的输出产生任何影响——包括影响时间、影响长度、影响报错。
三条判据:
- 位置不等于路径。「本地运行」「私有部署」「数据不出内网」都是位置的承诺。它们一个字都没有回答:这份数据在这套系统里,会留下几条流。
- 每个开关只管一条流。「关掉训练」管的是训练集,「关掉同步」管的是文字同步,「用自己的 Key」管的是计费与模型端——三条流各走各的门。你以为的那个总闸,从来没有存在过。
- 合规的动作可以合起来构成泄露。 四条路,没有一条违规,没有一个人做了错事,没有一份文件离开过那间屋。所以它极难被查——因为查的人手里只有一张清单:「东西有没有出去」。清单填完,永远是「没有」。
解法不是加锁,是列流:把「一支笔到一双眼睛」之间的每一段岔路写出来——谁经手、留多久、谁能读、关掉哪个开关——再逐条最小化。每跨过一次边界,标签要重贴一次。
故事里的映射
| 故事里的东西 | 对应什么 |
|---|---|
| 无窗、一门、一锁的屋子 | 「本地执行 / 私有化部署 / 数据不出内网」的位置承诺 |
| 铜锁与腰上唯一的钥匙 | 访问控制(最小权限)——权限对,不等于流被控 |
| 验房、验人、验纸 | 只验容器的审计:数窗、数人、数纸,都答不了「字到过谁手里」 |
| 《领墨单》上写案由 | 供应链遥测:供应商从用量与工单反推内容 |
| 誊本送驿校对 | 中继与网关:为了可用性,把原文递出边界一次 |
| 回单写卷由与字数 | 日志、摘要、元数据外流——不抄全文,够还原八成 |
| 《抄目》月报架阁库 | 索引外流:不泄露内容,泄露「有什么」 |
| 卫幕僚手上那本册子 | 把四段合规记录拼回来的那一份 |
| 韩知县改的三件事 | 路径最小化,加跨边界重贴标签——不是再加一把锁 |
| 「秘密不是东西,秘密是路」 | 保密性是流属性,不是位置属性 |
现实中的表现
- 本地部署的 AI:权重在你机器上,一次对话仍可能经模型端、遥测、日志、客服工单、备份、审批回执。位置对了,流没数过。
- 六个开关的错觉:训练开关、同步开关、自带 Key、自托管、删对话、退出账号——六条流,六个门。关掉一个,人会有「已经安全了」的踏实感,而那份踏实正是最贵的部分。
- 企业数据合规:个保法、数据出境审的是「接收方与流向」,不是「存在哪台机器」。
- 审计的通病:能被数的是容器,该被查的是流。所以几乎所有「零事故」的报告,都只回答了最容易回答的那一半。
给 AI 时代的企业
客户问「我们的数据会不会出去」,交付物不该是一句「我们本地部署」,而是一页纸的流表:一次对话,会经过哪几条路,每条留多久、谁能读、关掉哪个开关。
这张表不好看。它一定会列出几条你还没关、也关不掉的路。但它至少答的是被问的那个问题。
能给出流表的人,才是真的看过系统;只能给出口号的人,卖的是安慰。
那把铜锁后来还挂在门上,钥匙照旧有人管。只是《县衙则例》的末尾多了一行小字:凡说「不出此屋」的,先答一句——此屋到那一双眼睛,中间有几条路。
灵光 · 用一个故事讲清楚一个概念。