歷史上一行程式所引發的災難
本篇文章搜集歷史上僅因一行程式錯誤所引發的災難。
X Server ( 2006 年 )
X Server 在編譯過程中會檢查用戶是不是 root
,但是程式寫錯導致該判斷被忽略。
--- hw/xfree86/common/xf86Init.c.orig 2006-03-17 23:31:45.000000000 +0200
+++ hw/xfree86/common/xf86Init.c 2006-03-17 23:32:03.000000000 +0200
@@ -1377,7 +1377,7 @@
}
/* First the options that are only allowed for root */
- if (getuid() == 0 || geteuid != 0)
+ if (getuid() == 0 || geteuid() != 0)
{
if (!strcmp(argv[i], "-modulepath"))
{
@@ -1677,7 +1677,7 @@
}
if (!strcmp(argv[i], "-configure"))
{
- if (getuid() != 0 && geteuid == 0) {
+ if (getuid() != 0 && geteuid() == 0) {
ErrorF("The '-configure' option can only be used by root.\n");
exit(1);
}
Debian OpenSSL ( 2008 年 )
Debian 在 2008 年被發現其開發者自行「客製化」了 OpenSSL 函式庫,把重要的程式碼註解了,而這將帶來嚴重的安全性問題,使得系統的加密密鑰更容易被猜測。
--- openssl-a/md_rand.c
+++ openssl-b/md_rand.c
@@ -271,10 +271,7 @@
else
MD_Update(&m,&(state[st_idx]),j);
-/*
- * Don't add uninitialised data.
MD_Update(&m,buf,j);
-*/
MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
MD_Final(&m,local_md); md_c[1]++;
官方 OpenSSL ( 2008 年 )
OpenSSL 0.9.8i 及其先前版本被發現 EVP_VerifyFinal 函式的回傳值沒有被正確檢查,使得駭客得以利用偽造的 SSL/TLS 繞過安全驗證,達到遠端攻擊系統的目的。
--- lib/libssl/src/ssl/s3_srvr.c
+++ lib/libssl/src/ssl/s3_srvr.c
@@ -2009,7 +2009,7 @@ static int ssl3_get_client_certificate(S
else
{
i=ssl_verify_cert_chain(s,sk);
- if (!i)
+ if (i <= 0)
{
al=ssl_verify_alarm_type(s->verify_result);
SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
Android ( 2010 年 )
Android 針對 memset 的修正。
--- libc-a/memset.c
+++ libc-b/memset.c
@@ -1,6 +1,6 @@
void *memset(void *_p, unsigned v, unsigned count)
{
unsigned char *p = _p;
- while(count-- > 0) *p++ = 0;
+ while(count-- > 0) *p++ = v;
return _p;
}
Tarsnap ( 2011 年 )
Tarsnap 的安全修正。
--- tarsnap-autoconf-1.0.27/lib/crypto/crypto_file.c
+++ tarsnap-autoconf-1.0.28/lib/crypto/crypto_file.c
@@ -108,7 +108,7 @@
/* Encrypt the data. */
if ((stream =
- crypto_aesctr_init(&encr_aes->key, encr_aes->nonce)) == NULL)
+ crypto_aesctr_init(&encr_aes->key, encr_aes->nonce++)) == NULL)
goto err0;
crypto_aesctr_stream(stream, buf, filebuf + CRYPTO_FILE_HLEN, len);
crypto_aesctr_free(stream);
bumblebee ( 2011 年 )
bumblebee 在安裝過程中,因為『多了一個空白』,而導致用戶系統的重要檔案遭到刪除。
@@ -348,7 +348,7 @@ case "$DISTRO" in
- rm -rf /usr /lib/nvidia-current/xorg/xorg
+ rm -rf /usr/lib/nvidia-current/xorg/xorg
Apple SSL/TLS ( 2014 年 )
Apple 這次的安全更新可威了。因為『不小心多了一行程式』,所以 SSL 安全檢查完全被繞過了。
static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams,
uint8_t *signature, UInt16 signatureLen)
{
OSStatus err;
...
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;
...
fail:
SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;
}