# FREAK是什么？定义、例子与常见误区

> FREAK 是 2015 年公布的攻击，中间人诱使有漏洞的 TLS 客户端接受可被分解的 512 位出口级 RSA 密钥，从而解密和篡改流量。

Source: https://ssl.sh/zh/glossary/freak/
Last updated: 2026-11-10

FREAK 于 2015 年 3 月公布。上世纪 90 年代，美国的出口管制限制了对外提供的密码强度，SSL/TLS 因此有了使用 512 位 [RSA](https://ssl.sh/zh/glossary/rsa/) 密钥的“出口级”密码套件。包括 OpenSSL（CVE-2015-0204）以及 Apple、微软的 TLS 实现在内，有漏洞的客户端存在状态机错误：即使自己没有请求出口级套件，也会接受服务器发来的 512 位临时 RSA_EXPORT 密钥。中间人把客户端的请求改成出口级套件，服务器若仍支持，就会返回 512 位密钥；攻击者将其分解后完成握手，即可读取或篡改流量。不少服务器长时间复用同一个出口级密钥，提前分解它就很划算。

## 为什么重要
FREAK 表明，为了“以防万一”而保留的遗留套件，几十年后依然危险；客户端的实现错误还能把服务器残留的弱点变成可实际利用的攻击。修复需要两端配合：客户端库打补丁，服务器删除所有 EXPORT 套件。TLS 1.3 则彻底去掉了出口级密码和 RSA 密钥交换。几个月后公布的 [Logjam](https://ssl.sh/zh/glossary/logjam/) 把同样的思路用在了 [Diffie-Hellman](https://ssl.sh/zh/glossary/diffie-hellman/) 上。如今检查老旧设备和遗留系统时，出口级套件依然是值得顺手确认的一项。

## 例子
```bash
nmap --script ssl-enum-ciphers -p 443 example.com | grep -i export
```

没有输出说明服务器不提供出口级套件。当前版本的 OpenSSL 已完全不包含出口级套件。

## 常见误区
- **只是服务器的问题。** 根源在于客户端库接受了自己没有请求的密钥，服务器只是恰好还开着出口级套件。
- **512 位 RSA 依然很难分解。** 512 位 RSA 模数早在 1999 年就被公开分解，今天成本更低。
- **FREAK 和证书的密钥长度有关。** 证书本身可以是 2048 位 RSA，FREAK 利用的是另一把临时的出口级密钥。

## 相关术语

- [RSA](https://ssl.sh/zh/glossary/rsa/): RSA 是 1977 年提出的公钥算法，TLS 用它对证书和握手进行签名，在 TLS 1.3 之前还用它传输会话密钥。
- [Logjam](https://ssl.sh/zh/glossary/logjam/): Logjam 是 2015 年公布的攻击（CVE-2015-4000），可把 TLS 降级到 512 位出口级 Diffie-Hellman，并威胁使用过小或被大量共用 DH 参数的服务器。
- [Diffie-Hellman](https://ssl.sh/zh/glossary/diffie-hellman/): Diffie-Hellman 是 1976 年提出的密钥协商方法，让通信双方在公开信道上各自算出相同的共享秘密，而无需传输这个秘密本身。
- [降级攻击](https://ssl.sh/zh/glossary/downgrade-attack/): 降级攻击是指攻击者迫使客户端和服务器协商出比双方实际支持的更旧的协议版本或更弱的算法，从而利用其中的弱点。
- [密码套件](https://ssl.sh/zh/glossary/cipher-suite/): 密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合，例如 TLS_AES_128_GCM_SHA256，决定连接用什么算法保护数据。
- [密钥长度](https://ssl.sh/zh/glossary/key-size/): 密钥长度是密钥的位数，其安全含义取决于算法，例如 256 位的 ECDSA 密钥比 2048 位的 RSA 密钥更强。
