Source code taken from cacert-20140419.tar.bz2
[cacert.git] / scripts / send_heartbleed.php
1 #!/usr/bin/php -q
2 <?php
3 /*
4 LibreSSL - CAcert web application
5 Copyright (C) 2004-2009 CAcert Inc.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; version 2 of the License.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20 include_once("../includes/mysql.php");
21
22 // read texts
23
24 $lines_EN = <<<EOF
25
26 there are news [1] about a bug in OpenSSL that may allow an attacker to leak arbitrary information from any process using OpenSSL. [2]
27
28 We contacted you, because you have subscribed to get general announcements, or you have had a server certificate since the bug was introduced into the OpenSSL releases and are especially likely to be affected by it.
29
30 CAcert is not responsible for this issue. But we want to inform members about it, who are especially likely to be vulnerable or otherwise affected.
31
32
33 Good news:
34 ==========
35 Certificates issued by CAcert are not broken and our central systems did not leak your keys.
36
37
38 Bad news:
39 =========
40 Even then you may be affected.
41
42 Although your keys were not leaked by CAcert your keys on your own systems might have been compromised if you were or are running a vulnerable version of OpenSSL.
43
44
45 To elaborate on this:
46 =====================
47 The central systems of CAcert and our root certificates are not affected by this issue. Regrettably some of our infrastructure systems were affected by the bug. We are working to fix them and already completed work for the most critical ones. If you logged into those systems, within the last two years, (see list in the blog post) you might be affected!
48
49 But unfortunately given the nature of this bug we have to assume that the certificates of our members may be affected, if they were used in an environment with a publicly accessible OpenSSL connection (e.g. Apache web server, mail server, Jabber server, ...). The bug has been open in OpenSSL for two years - from December 2011 and was introduced in stable releases starting with OpenSSL 1.0.1.
50
51 When an attacker can reach a vulnerable service he can abuse the TLS heartbeat extension to retrieve arbitrary chunks of memory by exploiting a missing bounds check. This can lead to disclosure of your private keys, resident session keys and other key material as well as all volatile memory contents of the server process like passwords, transmitted user data (e.g. web content) as well as other potentially confidential information.
52
53 Exploiting this bug does not leave any noticeable traces, thus for any system which is (or has been) running a vulnerable version of OpenSSL you must assume that at least your used server keys are compromised and therefore must be replaced by newly generated ones. Simply renewing existing certificates is not sufficient! - Please generate NEW keys with at least 2048 bit RSA or stronger!
54
55 As mentioned above this bug can be used to leak passwords and thus you should consider changing your login credentials to potentially compromised systems as well as any other system where those credentials might have been used as soon as possible.
56
57 An (incomplete) list of commonly used software which include or link to OpenSSL can be found at [5].
58
59
60 What to do?
61 ===========
62 - Ensure that you upgrade your system to a fixed OpenSSL version (1.0.1g or above).
63 - Only then create new keys for your certificates.
64 - Revoke all certificates, which may be affected.
65 - Check what services you have used that may have been affected within the last two years.
66 - Wait until you think that those environments got fixed.
67 - Then (and only then) change your credentials for those services. If you do it too early, i.e. before the sites got fixed, your data may be leaked, again. So be careful when you do this.
68
69
70 CAcert's response to the bug:
71 =============================
72 - We updated most of the affected infrastructure systems and created new certificates for them. The remaining will follow, soon.
73 - We used this opportunity to upgrade to 4096 bit RSA keys signed with SHA-512. The new fingerprints can be found in the list in the blog post. ;-)
74 - With this email we contact all members, who had active server certificates within the last two years.
75 - We will keep you updated, in the blog.
76
77 A list of affected and fixed infrastructure systems and new information can be found at:
78
79 https://blog.cacert.org/2014/04/openssl-heartbleed-bug/
80
81
82 Links:
83 [1] http://heartbleed.com/
84 [2] https://www.openssl.org/news/secadv_20140407.txt
85 [3] https://security-tracker.debian.org/tracker/CVE-2014-0160
86 [4] http://www.golem.de/news/sicherheitsluecke-keys-auslesen-mit-openssl-1404-105685.html
87 [5] https://www.openssl.org/related/apps.html
88 EOF;
89
90 $lines_EN = wordwrap($lines_EN, 75, "\n");
91 $lines_EN = mb_convert_encoding($lines_EN, "HTML-ENTITIES", "UTF-8");
92
93
94 $lines_DE = <<<EOF
95 ---
96 German Translation / Deutsche Übersetzung:
97
98
99 Liebes CAcert-Mitglied,
100
101 es wurde ein Bug in OpenSSL gefunden [4], der es einem Angreifer erlaubt beliebige Informationen jedes Prozesses zu erlangen, der OpenSSL nutzt. [2]
102
103 Wir schicken diese Mail an alle Mitglieder, die entweder die "Allgemeinen Ankündigungen" abonniert haben, oder von dem Bug besonders betroffen sein können, da sie Server-Zertifikate in der Zeit besessen haben, seitdem der Bug in die Releases von OpenSSL integriert wurde.
104
105 Diese Gefahr geht nicht von CAcert aus, wir möchten aber gefährdete Mitglieder entsprechend informieren.
106
107
108 Die gute Nachricht:
109 ===================
110 Die von CAcert ausgestellten Zertifikate sind nicht kaputt und unsere zentralen Systeme waren auch nicht angreifbar und haben auch keine Schlüssel verraten.
111
112
113 Die schlechte Nachricht:
114 ========================
115 Dennoch kann jeder betroffen sein!
116
117 Auch wenn keine Schlüssel durch CAcert preisgegeben wurden, können sie dennoch später kompromittiert worden sein, wenn auf Ihren Systemen eine angreifbaren Version von OpenSSL lief und die Schlüssel dort verwendet wurden.
118
119
120 Um ins Detail zu gehen:
121 =======================
122 Die zentralen Systeme und die Stammzertifikate von CAcert sind von diesem Problem nicht betroffen. Leider sind einige unserer Infrastruktur-Systeme durch den Fehler betroffen. Wir arbeiten daran diese zu beheben und haben dies auch schon für die meisten erledigt. Jeder, der sich auf diese Systeme in den letzten zwei Jahren eingeloggt hat kann betroffen sein!
123
124 Aufgrund der Art des Fehlers, müssen wir leider davon ausgehen, dass die Zertifikate unserer Mitglieder betroffen sind, wenn sie sich in eine Umgebung eingeloggt haben, die über öffentliche OpenSSL-Verbindungen zugänglich war (z.B. Apache Webserver, Mail-Server, Jabber-Server, ...). Dieser Fehler war zwei Jahre lang in OpenSSL - seit Dezember 2011 - und kam beginnend mit Version 1.0.1 in die stabilen Versionen.
125
126 Angreifer, die einen verwundbaren Service erreichen können, können die TLS-Erweiterung "heartbeat" ausnutzen, um beliebige Speicherbereiche zu auslesen, indem sie eine fehlende Bereichsprüfung ausnutzen. Das kann zur Offenlegung von privaten Schlüsseln, im Speicher abgelegten Sitzungsschlüsseln, sonstige Schlüssel genauso wie jeglicher weiterer Speicherinhalt des Server-Prozesses wie Passwörter oder übermittelte Benutzerdaten (z.B. Webinhalte) oder anderer vertrauliche Informationen führen.
127
128 Die Ausnutzung dieses Fehlers hinterlässt keine merklichen Spuren. Daher muss für jedes System, auf dem eine angreifbare Version von OpenSSL läuft (oder lief), angenommen werden, dass zumindest die verwendeten Server-Zertifikate kompromittiert sind und deswegen durch NEU generierte ersetzt werden müssen. Einfach die alten Zertifikate zu erneuern, reicht nicht aus! - Bitte NEUE Schlüssel mit 2048 Bit RSA oder stärker generieren!
129
130 Wie oben erwähnt kann dieser Fehler ausgenutzt werden, um Passwörter zu entwenden. Daher sollte jeder überlegen, alle Zugangsdaten zu möglicherweise betroffenen Systemen und allen Systemen bei denen diese sonst noch verwendet worden sein könnten, so bald wie möglich auszutauschen.
131
132 Eine (unvollständige) Liste an weit verbreiteter Software die OpenSSL verwendet kann z.B. unter folgendem Link gefunden werden. [5]
133
134
135 Was ist zu tun?
136 ===============
137 - Als erstes müssen die eigenen Systeme auf eine fehlerbereinigte Version von OpenSSL aktualisiert werden (Version 1.0.1g oder neuer).
138 - Danach neue Schlüssel für die Zertifikate erstellen. Jetzt ist es sicher das zu tun.
139 - Alle möglicherweise betroffenen Zertifikate widerrufen.
140 - Überprüfen, welche fremden Dienste in den letzten zwei Jahren besucht worden sind.
141 - Warten, bis dort wahrscheinlich der Fehler behoben wurde.
142 - Dann (und erst dann) die Login-Daten für diese Dienste erneuern. Vorsicht: Wenn das zu früh getan wird, also wenn der Dienst noch nicht bereinigt wurde, können die Daten wieder abgegriffen werden.
143
144
145 CAcerts Maßnahmen als Antwort auf den Bug:
146 ==========================================
147 - Wir haben so gut wie alle Infrastruktur-Systeme auf den neuesten OpenSSL-Stand gebracht und für diese neue Zertifikate zu generiert, die restlichen folgen so schnell wie möglich.
148 - Wir haben die Gelegenheit genutzt, um dabei auf 4096 Bit RSA-Schlüssel, die mit SHA-512 signiert sind, aufzurüsten.
149 - Mit dieser E-Mail kontaktieren wir alle Mitglieder, die in den letzten zwei Jahren aktive Server-Zertifikate hatten.
150 - Wir werden neue Informationen im Blog veröffentlichen.
151
152 Eine Liste der betroffenen und reparierten Infrastruktur-Systeme befindet sich unter:
153
154 https://blog.cacert.org/2014/04/openssl-heartbleed-bug/
155
156 Links:
157 [1] http://heartbleed.com/
158 [2] https://www.openssl.org/news/secadv_20140407.txt
159 [3] https://security-tracker.debian.org/tracker/CVE-2014-0160
160 [4] http://www.golem.de/news/sicherheitsluecke-keys-auslesen-mit-openssl-1404-105685.html
161 [5] https://www.openssl.org/related/apps.html
162 EOF;
163
164 $lines_DE = wordwrap($lines_DE, 75, "\n");
165 $lines_DE = mb_convert_encoding($lines_DE, "HTML-ENTITIES", "UTF-8");
166
167
168 // read last used id
169 $lastid = 0;
170 if (file_exists("send_heartbleed_lastid.txt"))
171 {
172 $fp = fopen("send_heartbleed_lastid.txt", "r");
173 $lastid = trim(fgets($fp, 4096));
174 fclose($fp);
175 }
176
177 echo "ID now: $lastid\n";
178
179
180 $count = 0;
181
182 $query = "
183 (
184 select u.`id`, u.`fname`, u.`lname`, u.`email`, u.`language`
185 from `users` as u, `alerts` as a
186 where u.`deleted` = 0 and u.`id` > '$lastid'
187 and a.`memid` = u.`id`
188 and a.`general` = 1
189 )
190 union distinct
191 (
192 select u.`id`, u.`fname`, u.`lname`, u.`email`, u.`language`
193 from `users` as u, `domains` as d, `domaincerts` as dc
194 where u.`deleted` = 0 and u.`id` > '$lastid'
195 and dc.`domid` = d.`id` and d.`memid` = u.`id`
196 and dc.`expire` >= '2011-12-01'
197 )
198 union distinct
199 (
200 select u.`id`, u.`fname`, u.`lname`, u.`email`, u.`language`
201 from `users` as u, `domains` as d, `domlink` as dl, `domaincerts` as dc
202 where u.`deleted` = 0 and u.`id` > '$lastid'
203 and dc.`id` = dl.`certid` and dl.`domid` = d.`id` and d.`memid` = u.`id`
204 and dc.`expire` >= '2011-12-01'
205 )
206 union distinct
207 (
208 select u.`id`, u.`fname`, u.`lname`, u.`email`, u.`language`
209 from `users` as u, `org` as o, `orgdomaincerts` as dc
210 where u.`deleted` = 0 and u.`id` > '$lastid'
211 and dc.`orgid` = o.`orgid` and o.`memid` = u.`id`
212 and dc.`expire` >= '2011-12-01'
213 )
214 union distinct
215 (
216 select u.`id`, u.`fname`, u.`lname`, u.`email`, u.`language`
217 from `users` as u, `org` as o, `orgdomains` as d, `orgdomlink` as dl, `orgdomaincerts` as dc
218 where u.`deleted` = 0 and u.`id` > '$lastid'
219 and dc.`id` = dl.`orgcertid` and dl.`orgdomid` = d.`id`
220 and d.`orgid` = o.`orgid` and o.`memid` = u.`id`
221 and dc.`expire` >= '2011-12-01'
222 )
223 order by `id`";
224
225 $res = mysql_query($query);
226
227 while($row = mysql_fetch_assoc($res))
228 {
229 $mailtxt = "Dear ${row["fname"]} ${row["lname"]},\n".$lines_EN."\n\n";
230 switch ($row["language"])
231 {
232 case "de_DE":
233 case "de":
234 $mailtxt .= $lines_DE;
235 break;
236 }
237
238 sendmail($row['email'], "[CAcert.org] Information about Heartbleed bug in OpenSSL 1.0.1 up to 1.0.1f", $mailtxt, "support@cacert.org", "", "", "CAcert", "returns@cacert.org", "");
239
240 $fp = fopen("send_heartbleed_lastid.txt", "w");
241 fputs($fp, $row["id"]."\n");
242 fclose($fp);
243
244 $count++;
245 echo "Sent ${count}th mail. User ID: ${row["id"]}\n";
246
247 sleep (1);
248 }