本篇文章搜集歷史上僅因一行程式錯誤所引發的災難。

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;
}