Version bump for release.
[irker.git] / security.txt
1 = Security analysis of irker =
2
3 This is an analysis of security and DoS vulnerabilities associated
4 with irker, exploring and explaining certain design choices.  Much of
5 it derives from a code audit and report by Daniel Franke.
6
7 == Assumptions and Goals ==
8
9 We begin by stating some assumptions about how irker will be deployed,
10 and articulating a set of security goals.
11
12 Communication flow in an irker deployment will look like this:
13
14 -----------------------------------------------------------------------------
15              Committers
16                  |
17                  |
18         Version-control repositories
19                  |
20                  |
21             irkerhook.py
22                  |
23                  |
24                irkerd
25                  |
26                  |
27              IRC servers
28 -----------------------------------------------------------------------------
29
30 Here are our assumptions:
31
32 1. The repositories are hosted on a public forge sites such as
33 SourceForge, GitHub, Gitorious, Savannah, or Gna and must be
34 accessible to untrusted users. 
35
36 2. Repository project owners can set properties on their repositories
37 (including but not limited to irker.*), and may be able to set custom
38 post-commit hooks which can execute arbitrary code on the repostory
39 server. In particular, these people my be able to modify the local
40 copy of irkerhook.py.
41
42 3. The machine which hosts irkerd has the same owner as the machine which
43 hosts the the repo; these machines are possibly but not necessarily
44 one and the same. 
45
46 4. The network is protected by a perimeter firewall, and only a
47 trusted group is able to emit arbitrary packets from inside the
48 perimeter; committers are not necessarily part of this group.
49
50 5. irkerd communicates with IRC servers over the open internet,
51 and an IRC server's administrator is assumed to hold no position of
52 trust with any other party.
53
54 We can, accordingly, identify the following groups of security
55 principals:
56
57 A. irker administrators.
58 B. Project committers.
59 C. Project owners
60 D. IRC server administrators.
61 E. Other people on irker's internal network.
62 F. irkerd-IRC men-in-the-middle (i.e. people who control the network path
63    between irkerd and the IRC server).
64 G. Random people on the internet.
65
66 Our security goals for irker can be enumerated as follows:
67
68 * Control: We don't want anyone outside group A gaining control of
69   the machines which host irkerd or the git repos.
70
71 * Availability: Only group A should be able to to deny or degrade
72   irkerd's ability to receive commit messages and relay them to the
73   IRC server. We recognize and accept as inevitable that MITMs (groups
74   E and F) can do this too (by ARP spoofing, cable-cutting, etc.).
75   But, in particular, we would like irker-mediated services to be
76   resilient against DoS (denial of service) attacks.
77
78 * Authentication/integrity: Notifications should be truthful, i.e.,
79   commit messages sent to IRC channels should actually reflect that a
80   corresponding commit has taken place. We accept that groups A, C,
81   D, and E can violate this property.
82
83 * Secrecy: irker shouldn't aid spammers (group G) in harvesting
84   committers' email addresses.
85
86 * Auditability: If people abuse irkerd, we want to be able to identify
87   the abusive account or IP address.
88
89 == Control Issues ==
90
91 We have audited the irker and irkerhook.py code for exploitable 
92 vulnerabilities.  We have not found any in the code itself, and the
93 use of Python gives us confidence in the absence of large classes of errors
94 (such as buffer overruns) that afflict C programs.
95
96 However, the fact that irkerhook.py relies on external binaries to
97 mine data out of its repository opens up a well-known set of
98 vulnerabilities if a malicious user is able to insert binaries in a
99 carelessly-set execution path.  Normal precautions against this should
100 be taken.
101
102 == Availability ==
103
104 === Solved problems ===
105
106 When the original implementation of irkerd saw a nick collision it
107 generated new nicks in a predictable sequence. A malicious IRC user
108 could have continuously changed his own nick to the next one that
109 irkerd is going to try. Some randomness has been added to nick
110 generation to prevent this.
111
112 === Unsolved problems ===
113
114 DoS attacks on any networked application can never completely
115 prevented, only mitigated by forcing attackers to invest more
116 resources.  Here we consider the easiest attack paths against irker,
117 and possible countermeasures.
118
119 irker handles each connection to a particular IRC server in a separate
120 thread - actually, due to server limits on open channels per
121 connection, there may be multiple sessions per server. This may not
122 scale well, especially on 32-bit architectures. 
123
124 Thread instance overhead, combined with the lack of any restriction on
125 how many URLs can appear in the 'to' list, is a DoS vulnerability. If
126 a repository's properties specify that notifications should go to more
127 than about 500 unique hostnames, then on 32-bit architectures we'll
128 hit the 4GB cap on virtual memory (even while the resident set size
129 remains small).
130
131 Another ceiling to watch out for is the ulimit on file descriptors,
132 which defaults to 1024 on many Linux systems but can safely be set
133 much larger. Each connection instance costs a file descriptor.
134
135 We consider some possible ways of addressing the problem:
136
137 1. Limit the number of URLs in a request.  Pretty painless - it will
138 be very rare that anyone wants to specify a larger set than a project
139 channel plus freenode #commits - but also ineffective.  A malicious
140 hook could achieve DoS simply by spamming lots of requests.
141
142 2. Limit the total number of requests than can be queued. Completely
143 ineffective - just sets a target for the DoS attack.
144
145 3. Limit the number of requests that can be queued by source IP address.
146 This might be worth doing; it would stymie a single-source DoS attack through
147 a publicly-exposed irkerd, though not a DDoS by a botnet.  But there isn't
148 a lot of win here for a properly installed irker (e.g. behind a firewall), 
149 which is typically going to get all its requests from a single repo host
150 anyway.
151
152 4. Rate-limit requests by source IP address - that is, after any request
153 discard additional ones during some timeout period.  Again, good for 
154 stopping a single-source DoS against an exposed irker, won't stop a
155 DDoS.  The real problem though, is that any such rate limit might interfere
156 with legitimate high-volume use by a very active repo site.
157
158 After this we appear to have run out of easy options, as source IP address
159 is the only thing irkerd can see that an attacker can't spoof.
160
161 We mitigate some availability risks by reaping old sessions when we're
162 near resource limits.  An ordinary DoS attack would then be prevented
163 from completely blocking all message traffic; the cost would be a
164 whole lot of join/leave spam due to connection churn.
165
166 == Authentication/Integrity ==
167
168 One way to help prevent DoS attacks would be in-band authentication -
169 requiring irkerd submitters to present a credential along with each
170 message submission.  In principle this, if it existed, could also be used
171 to verify that a submitter is authorized to issue notifications with
172 respect to a given project.
173
174 We rejected this approach. The design goal for irker was to make
175 submissions fast, cheap, and stateless; baking an authentication
176 system directly into the irkerd codebase would have conflicted with
177 these objectives, not to mention probably becoming the camel's nose
178 for a godawful amount of code bloat.
179
180 The deployment advice in the installation instructions assumes that 
181 irkerd submitters are "authenticated" by being inside a firewall - that is,
182 mesages are issued from an intranet and it can be trusted that anyone 
183 issuing messages from within a given intranet is authorized to do so.
184 This fits the assumption that irker instances will run on forge sites
185 receiving requests from instances of irkerhook.py.
186
187 One larger issue (not unique to irker) is that because of the
188 insecured nature of IRC it is essentially impossible to secure
189 #commits against commit notifications that are either garbled by
190 software errors and misconfigurations or maliciously crafted to
191 confuse anyone attempting to gather statistics from that channel.  The
192 lesson here is that IRC monitoring isn't a good method for that
193 purpose; going direct to the repositories via a toolkit such as Ohloh
194 is a far better idea.
195
196 When this analysis was originally written, we recommended using spiped
197 or stunnel to solve the problem of passing notifications from irkerd
198 to IRC servers over a potentially hostile network that might interfere
199 with them.  Later, SSL/TLS support proved easy to add and is now in
200 irkerd itself.
201
202 == Secrecy ==
203
204 irkerd has no inherent secrecy risks.
205
206 The distributed version of irkerhook.py removes the host part of
207 author addresses specifically in order to prevent address harvesting
208 from the notifications.
209
210 == Auditability ==
211
212 We previously noted that source IP address is the only thing irker can
213 see that an attacker can't spoof.  This makes auditability difficult
214 unless we impose conventions on the notifications passing though it.
215
216 The irkerhook.py that we ship inherits an auditability property from
217 the CIA service it was designed to replace: the first field of every
218 notification (terminated by a colon) is the name of the issuing
219 project.  The only other competitor to replace CIA known to us
220 (kgb_bot) shares this property.
221
222 In the general case we cannot guarantee this property against
223 groups A and F.
224
225 == Risks relative to centralized services ==
226
227 irker and irkerhook.py were written as a replacement for the
228 now-defunct CIA notification service.  The author has written
229 a critique of that service: "CIA and the perils of overengineering"
230 at <http://esr.ibiblio.org/?p=4540>.  It is thus worth considering how
231 a risk assessment of CIA compares to this one.
232
233 The principal advantages of CIA from a security point of view were (a)
234 it provided a single point at which spam filtering and source blocking
235 could be done with benefit to all projects using the service, and (b)
236 since it had to have a database anyway for routing messages to project
237 channels, the incremental overhead for an authentication feature would
238 have been relatively low.
239
240 As a matter of fact rather than theory CIA never fully exploited
241 either possibility.  Anyone could create a CIA project entry with
242 fanout to any desired set of IRC channels.  Notifications were not
243 authenticated, so anyone could masquerade as a member of any project.
244 The only check on abuse was human intervention to source-block
245 spammers, and this was by no means completely effective - spam shipped
246 via CIA was occasionally seen on on the freenode #commits channel.
247
248 The principal security disadvantage of CIA was that it meant the
249 entire notification system was subject to single-point failure due
250 to software or hosting failures on cia.vc, or to DoS attacks
251 against the server.  While there is no evidence that the site
252 was ever deliberately DoSed, failures were sufficiently common
253 that a half-hearted DoS attack might not have been even noticed.
254
255 Despite the absence of authentication, irker instances on
256 properly firewalled intranets do not obviously pose additional
257 spamming risks beyond those incurred by the CIA service.  The
258 overall robustness of the notification system as a whole should
259 be greatly improved.
260
261 == Conclusions ==
262
263 The security and DoS issues irker has are not readily addressable by
264 changing the irker codebase itself, short of a complete (much more
265 complex and heavyweight) redesign.  They are largely implicit risks of
266 its operating environment and must be managed by properly controlling
267 access to irker instances.
268