公司监控员工电脑的原理和防范
公司监控员工的方式可以分为硬件和软件两种。前者包括办公区的监控摄像头、门禁系统、电话录音、电子围栏、打印机扫描仪使用记录等等。后者包括但不限于:
- 手机安装 APP
- 员工使用公司 OA 系统的操作日志
- 公司网络嗅探
- 办公电脑安装监控软件
- 网络舆情监控
本文主要讨论的是第 3 和第 4 种的情况。
特别要指出一点,如果公司的办公区域比较大,且安装了多个 AP 的话,公司可以通过员工手机连接的无线热点来对员工进行定位,原理就和手机基站定位类似。这项技术还被适用于一些大型公共设施中,例如:酒店、医院、商场等。最好的防范方式就是手机不要连接陌生热点,使用自己的流量。
网络嗅探
网络嗅探,也就是俗话说的「数据抓包」。一旦员工的电脑或其他设备连接了公司的网络,那么其所有的网络流量对公司都是可见的。通过分析流量数据,公司可以知道到员工的网络聊天内容,还有访问了哪些网站。虽然一些国产聊天工具号称通信内容都已加密,但是您千万别特么相信它,鬼知道它留了什么后门。
现在大部分网站都启用了 HTTPS 访问。HTTPS 使用 TLS (SSL) 加密协议,可以一定程度上防止网络嗅探识别出明文内容,不过公司是很容易进行中间人攻击( MitM )的。比如大多数公司的员工电脑都加入了公司的域,那么公司就可以给加域的主机安装私有的 CA 根证书。这些操作对普通用户来说是无法感知的,不过员工可以通过查看网站的证书颁发机构来判断 HTTPS 流量是否被劫持。此外,即便不使用中间人攻击,TLS 协议中的服务器名称指示( SNI )仍会暴露访问网站的域名信息。
除了直接分析网络流量,DNS 解析的记录也会暴露用户的网络浏览记录。虽然用户解析过某个域名并不能直接证明他访问过该域名,但是如果用户经常解析某个网站的域名,大概率就坐实了他经常在访问该网站了。事实上,公司通过员工的域名解析历史记录完全可以推算出员工的日常上网行为了。
员工为了避免网络流量被嗅探,可以使用 VPN 软件加密所有的上网流量,当然,这需要付出一点额外的成本。也可以采取非工作上网行为使用自己的手机流量的方式来避免网络嗅探。如果仅仅想避免 DNS 解析记录被嗅探,可以在浏览器中开启 DNS over HTTPS 或 DNS over TLS 功能;或者安装 DNS 中继软件 dnscrypt-proxy 2 ,然后将本机的 DNS 服务器设置为 127.0.0.1
。
Microsoft Edge 和 Google Chrome 都支持 DNS over HTTPS 。然而,当浏览器处于托管状态时,会导致无法启用 DoH 支持。Google 提供了解除托管的方法,不过当电脑加入了域以后,托管状态似乎是无法解除的,因此推荐使用 Mozilla Firefox 浏览器。设置方法可以参考《Configure DoH on your browser》一文。
国内用户可以使用阿里云的 DoH 服务:https://dns.alidns.com/dns-query
监控软件
最糟糕的状况就是办公电脑被安装监控软件,这意味着员工所有的操作都会被公司记录下来。监控软件中最知名的就是臭名昭著的某信服上网行为管理软件。这些监控软件往往内置了网络监控功能,并搭配监控网关沆瀣一气,如果不安装监控软件,或者停止监控软件运行,员工的电脑就无法联网。
一种规避监控的方法是使用虚拟机。监控软件只能监控宿主机,无法监控虚拟的客户机。还有一种比较大胆的方法是,将监控软件安装在虚拟机系统中,不过这种方法未经测试,不同的监控软件其监控原理也各不相同,是否有效还要视具体情况而定。Windows 上常用的虚拟机软件有 Hyper-V、VirtualBox 和 VMware Workstation Player。
监控软件还有个恶心的功能是截屏录屏,甚至管理员可以直接实时查看用户的屏幕。某些情况下,可以通过 Windows 多桌面来规避截屏和录屏。微软官方提供了一个名为 Desktops 的多桌面管理工具。Windows 其实和 Linux 一样,也可以创建多个桌面,只是 Windows 没有内置相关的操作工具。鉴于不同的监控软件截图的原理不一样,所以并不能保证此方法有效。
在 Windows 系统中,每个用户登录都对应一个 session (会话),每个 session 又包含一组 window station (窗口工作站)对象,而每个 window station 下可以包含一组 desktop (桌面)对象,以及剪贴板和其他系统全局对象。同一时刻,鼠标键盘只能和同一个桌面进行交互,这个可交互桌面被称为 Input Desktop 。用户登录后默认的 window station 名为 Winsta0
,其下有三个桌面,分别是 Winlogon
、 Default
和 ScreenSaver
。Windows 登录界面就是 Winlogon
桌面,而当系统进入屏保时,会切换到 ScreenSaver
桌面。每个 Windows 进程都隶属于一个 window station ,而同一个进程的不同线程可以运行在不同的 desktop 中。
监控软件作为服务,通常运行在非交互的工作站下,其 Default 桌面也是非活跃的。Windows 不会绘制非活跃桌面。服务进程使用 GetWindowsDC()
来访问桌面,只能得到一个完全黑屏的图像。监控软件服务进程首先要用 OpenInputDesktop()
获取当前的交互桌面,以及桌面所在的窗口工作站(通常是 Winsta0
)。然后通过 SetProcessWindowStation()
将进程切换到交互桌面所在的窗口工作站 ,再使用 SetThreadDesktop()
将运行截屏的线程切换到交互桌面,这样才能得到有效的桌面截屏。一般来说,监控软件仅在用户登入的时候执行一遍上述操作,因此当用户切换工作桌面后,监控软件的截图线程仍然工作在之前的桌面中,导致无法获取到当前桌面的实时屏幕。
更新:由于本人已长年未接触 Windows 开发,储备知识已经落伍。自 Vista 起,Windows 服务运行在 session 0 会话中,而用户进程运行在 session 1 会话中,不过截屏的基本原理还是一样的。
参考:https://learn.microsoft.com/en-us/windows/win32/winstation/desktops