1
2
3
4
5Internet Engineering Task Force (IETF) D. Lawrence
6Request for Comments: 8767 Oracle
7Updates: 1034, 1035, 2181 W. Kumari
8Category: Standards Track P. Sood
9ISSN: 2070-1721 Google
10 March 2020
11
12
13 Serving Stale Data to Improve DNS Resiliency
14
15Abstract
16
17 This document defines a method (serve-stale) for recursive resolvers
18 to use stale DNS data to avoid outages when authoritative nameservers
19 cannot be reached to refresh expired data. One of the motivations
20 for serve-stale is to make the DNS more resilient to DoS attacks and
21 thereby make them less attractive as an attack vector. This document
22 updates the definitions of TTL from RFCs 1034 and 1035 so that data
23 can be kept in the cache beyond the TTL expiry; it also updates RFC
24 2181 by interpreting values with the high-order bit set as being
25 positive, rather than 0, and suggests a cap of 7 days.
26
27Status of This Memo
28
29 This is an Internet Standards Track document.
30
31 This document is a product of the Internet Engineering Task Force
32 (IETF). It represents the consensus of the IETF community. It has
33 received public review and has been approved for publication by the
34 Internet Engineering Steering Group (IESG). Further information on
35 Internet Standards is available in Section 2 of RFC 7841.
36
37 Information about the current status of this document, any errata,
38 and how to provide feedback on it may be obtained at
39 https://www.rfc-editor.org/info/rfc8767.
40
41Copyright Notice
42
43 Copyright (c) 2020 IETF Trust and the persons identified as the
44 document authors. All rights reserved.
45
46 This document is subject to BCP 78 and the IETF Trust's Legal
47 Provisions Relating to IETF Documents
48 (https://trustee.ietf.org/license-info) in effect on the date of
49 publication of this document. Please review these documents
50 carefully, as they describe your rights and restrictions with respect
51 to this document. Code Components extracted from this document must
52 include Simplified BSD License text as described in Section 4.e of
53 the Trust Legal Provisions and are provided without warranty as
54 described in the Simplified BSD License.
55
56Table of Contents
57
58 1. Introduction
59 2. Terminology
60 3. Background
61 4. Standards Action
62 5. Example Method
63 6. Implementation Considerations
64 7. Implementation Caveats
65 8. Implementation Status
66 9. EDNS Option
67 10. Security Considerations
68 11. Privacy Considerations
69 12. NAT Considerations
70 13. IANA Considerations
71 14. References
72 14.1. Normative References
73 14.2. Informative References
74 Acknowledgements
75 Authors' Addresses
76
771. Introduction
78
79 Traditionally, the Time To Live (TTL) of a DNS Resource Record (RR)
80 has been understood to represent the maximum number of seconds that a
81 record can be used before it must be discarded, based on its
82 description and usage in [RFC1035] and clarifications in [RFC2181].
83
84 This document expands the definition of the TTL to explicitly allow
85 for expired data to be used in the exceptional circumstance that a
86 recursive resolver is unable to refresh the information. It is
87 predicated on the observation that authoritative answer
88 unavailability can cause outages even when the underlying data those
89 servers would return is typically unchanged.
90
91 We describe a method below for this use of stale data, balancing the
92 competing needs of resiliency and freshness.
93
94 This document updates the definitions of TTL from [RFC1034] and
95 [RFC1035] so that data can be kept in the cache beyond the TTL
96 expiry; it also updates [RFC2181] by interpreting values with the
97 high-order bit set as being positive, rather than 0, and also
98 suggests a cap of 7 days.
99
1002. Terminology
101
102 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
103 "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
104 "OPTIONAL" in this document are to be interpreted as described in
105 BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
106 capitals, as shown here.
107
108 For a glossary of DNS terms, please see [RFC8499].
109
1103. Background
111
112 There are a number of reasons why an authoritative server may become
113 unreachable, including Denial-of-Service (DoS) attacks, network
114 issues, and so on. If a recursive server is unable to contact the
115 authoritative servers for a query but still has relevant data that
116 has aged past its TTL, that information can still be useful for
117 generating an answer under the metaphorical assumption that "stale
118 bread is better than no bread."
119
120 [RFC1035], Section 3.2.1 says that the TTL "specifies the time
121 interval that the resource record may be cached before the source of
122 the information should again be consulted." [RFC1035], Section 4.1.3
123 further says that the TTL "specifies the time interval (in seconds)
124 that the resource record may be cached before it should be
125 discarded."
126
127 A natural English interpretation of these remarks would seem to be
128 clear enough that records past their TTL expiration must not be used.
129 However, [RFC1035] predates the more rigorous terminology of
130 [RFC2119], which softened the interpretation of "may" and "should".
131
132 [RFC2181] aimed to provide "the precise definition of the Time to
133 Live," but Section 8 of [RFC2181] was mostly concerned with the
134 numeric range of values rather than data expiration behavior. It
135 does, however, close that section by noting, "The TTL specifies a
136 maximum time to live, not a mandatory time to live." This wording
137 again does not contain BCP 14 key words [RFC2119], but it does convey
138 the natural language connotation that data becomes unusable past TTL
139 expiry.
140
141 As of the time of this writing, several large-scale operators use
142 stale data for answers in some way. A number of recursive resolver
143 packages, including BIND, Knot Resolver, OpenDNS, and Unbound,
144 provide options to use stale data. Apple macOS can also use stale
145 data as part of the Happy Eyeballs algorithms in mDNSResponder. The
146 collective operational experience is that using stale data can
147 provide significant benefit with minimal downside.
148
1494. Standards Action
150
151 The definition of TTL in Sections 3.2.1 and 4.1.3 of [RFC1035] is
152 amended to read:
153
154 TTL a 32-bit unsigned integer number of seconds that specifies the
155 duration that the resource record MAY be cached before the
156 source of the information MUST again be consulted. Zero values
157 are interpreted to mean that the RR can only be used for the
158 transaction in progress, and should not be cached. Values
159 SHOULD be capped on the order of days to weeks, with a
160 recommended cap of 604,800 seconds (7 days). If the data is
161 unable to be authoritatively refreshed when the TTL expires, the
162 record MAY be used as though it is unexpired. See Sections 5
163 and 6 of [RFC8767] for details.
164
165 Interpreting values that have the high-order bit set as being
166 positive, rather than 0, is a change from [RFC2181], the rationale
167 for which is explained in Section 6. Suggesting a cap of 7 days,
168 rather than the 68 years allowed by the full 31 bits of Section 8 of
169 [RFC2181], reflects the current practice of major modern DNS
170 resolvers.
171
172 When returning a response containing stale records, a recursive
173 resolver MUST set the TTL of each expired record in the message to a
174 value greater than 0, with a RECOMMENDED value of 30 seconds. See
175 Section 6 for explanation.
176
177 Answers from authoritative servers that have a DNS response code of
178 either 0 (NoError) or 3 (NXDomain) and the Authoritative Answer (AA)
179 bit set MUST be considered to have refreshed the data at the
180 resolver. Answers from authoritative servers that have any other
181 response code SHOULD be considered a failure to refresh the data and
182 therefore leave any previous state intact. See Section 6 for a
183 discussion.
184
1855. Example Method
186
187 There is more than one way a recursive resolver could responsibly
188 implement this resiliency feature while still respecting the intent
189 of the TTL as a signal for when data is to be refreshed.
190
191 In this example method, four notable timers drive considerations for
192 the use of stale data:
193
194 * A client response timer, which is the maximum amount of time a
195 recursive resolver should allow between the receipt of a
196 resolution request and sending its response.
197
198 * A query resolution timer, which caps the total amount of time a
199 recursive resolver spends processing the query.
200
201 * A failure recheck timer, which limits the frequency at which a
202 failed lookup will be attempted again.
203
204 * A maximum stale timer, which caps the amount of time that records
205 will be kept past their expiration.
206
207 Most recursive resolvers already have the query resolution timer and,
208 effectively, some kind of failure recheck timer. The client response
209 timer and maximum stale timer are new concepts for this mechanism.
210
211 When a recursive resolver receives a request, it should start the
212 client response timer. This timer is used to avoid client timeouts.
213 It should be configurable, with a recommended value of 1.8 seconds as
214 being just under a common timeout value of 2 seconds while still
215 giving the resolver a fair shot at resolving the name.
216
217 The resolver then checks its cache for any unexpired records that
218 satisfy the request and returns them if available. If it finds no
219 relevant unexpired data and the Recursion Desired flag is not set in
220 the request, it should immediately return the response without
221 consulting the cache for expired records. Typically, this response
222 would be a referral to authoritative nameservers covering the zone,
223 but the specifics are implementation dependent.
224
225 If iterative lookups will be done, then the failure recheck timer is
226 consulted. Attempts to refresh from non-responsive or otherwise
227 failing authoritative nameservers are recommended to be done no more
228 frequently than every 30 seconds. If this request was received
229 within this period, the cache may be immediately consulted for stale
230 data to satisfy the request.
231
232 Outside the period of the failure recheck timer, the resolver should
233 start the query resolution timer and begin the iterative resolution
234 process. This timer bounds the work done by the resolver when
235 contacting external authorities and is commonly around 10 to 30
236 seconds. If this timer expires on an attempted lookup that is still
237 being processed, the resolution effort is abandoned.
238
239 If the answer has not been completely determined by the time the
240 client response timer has elapsed, the resolver should then check its
241 cache to see whether there is expired data that would satisfy the
242 request. If so, it adds that data to the response message with a TTL
243 greater than 0 (as specified in Section 4). The response is then
244 sent to the client while the resolver continues its attempt to
245 refresh the data.
246
247 When no authorities are able to be reached during a resolution
248 attempt, the resolver should attempt to refresh the delegation and
249 restart the iterative lookup process with the remaining time on the
250 query resolution timer. This resumption should be done only once per
251 resolution effort.
252
253 Outside the resolution process, the maximum stale timer is used for
254 cache management and is independent of the query resolution process.
255 This timer is conceptually different from the maximum cache TTL that
256 exists in many resolvers, the latter being a clamp on the value of
257 TTLs as received from authoritative servers and recommended to be
258 7 days in the TTL definition in Section 4. The maximum stale timer
259 should be configurable. It defines the length of time after a record
260 expires that it should be retained in the cache. The suggested value
261 is between 1 and 3 days.
262
2636. Implementation Considerations
264
265 This document mainly describes the issues behind serving stale data
266 and intentionally does not provide a formal algorithm. The concept
267 is not overly complex, and the details are best left to resolver
268 authors to implement in their codebases. The processing of serve-
269 stale is a local operation, and consistent variables between
270 deployments are not needed for interoperability. However, we would
271 like to highlight the impact of various implementation choices,
272 starting with the timers involved.
273
274 The most obvious of these is the maximum stale timer. If this
275 variable is too large, it could cause excessive cache memory usage,
276 but if it is too small, the serve-stale technique becomes less
277 effective, as the record may not be in the cache to be used if
278 needed. Shorter values, even less than a day, can effectively handle
279 the vast majority of outages. Longer values, as much as a week, give
280 time for monitoring systems to notice a resolution problem and for
281 human intervention to fix it; operational experience has been that
282 sometimes the right people can be hard to track down and
283 unfortunately slow to remedy the situation.
284
285 Increased memory consumption could be mitigated by prioritizing
286 removal of stale records over non-expired records during cache
287 exhaustion. Eviction strategies could consider additional factors,
288 including the last time of use or the popularity of a record, to
289 retain active but stale records. A feature to manually flush only
290 stale records could also be useful.
291
292 The client response timer is another variable that deserves
293 consideration. If this value is too short, there exists the risk
294 that stale answers may be used even when the authoritative server is
295 actually reachable but slow; this may result in undesirable answers
296 being returned. Conversely, waiting too long will negatively impact
297 user experience.
298
299 The balance for the failure recheck timer is responsiveness in
300 detecting the renewed availability of authorities versus the extra
301 resource use for resolution. If this variable is set too large,
302 stale answers may continue to be returned even after the
303 authoritative server is reachable; per [RFC2308], Section 7, this
304 should be no more than 5 minutes. If this variable is too small,
305 authoritative servers may be targeted with a significant amount of
306 excess traffic.
307
308 Regarding the TTL to set on stale records in the response,
309 historically TTLs of 0 seconds have been problematic for some
310 implementations, and negative values can't effectively be
311 communicated to existing software. Other very short TTLs could lead
312 to congestive collapse as TTL-respecting clients rapidly try to
313 refresh. The recommended value of 30 seconds not only sidesteps
314 those potential problems with no practical negative consequences, it
315 also rate-limits further queries from any client that honors the TTL,
316 such as a forwarding resolver.
317
318 As for the change to treat a TTL with the high-order bit set as
319 positive and then clamping it, as opposed to [RFC2181] treating it as
320 zero, the rationale here is basically one of engineering simplicity
321 versus an inconsequential operational history. Negative TTLs had no
322 rational intentional meaning that wouldn't have been satisfied by
323 just sending 0 instead, and similarly there was realistically no
324 practical purpose for sending TTLs of 2^25 seconds (1 year) or more.
325 There's also no record of TTLs in the wild having the most
326 significant bit set in the DNS Operations, Analysis, and Research
327 Center's (DNS-OARC's) "Day in the Life" samples [DITL]. With no
328 apparent reason for operators to use them intentionally, that leaves
329 either errors or non-standard experiments as explanations as to why
330 such TTLs might be encountered, with neither providing an obviously
331 compelling reason as to why having the leading bit set should be
332 treated differently from having any of the next eleven bits set and
333 then capped per Section 4.
334
335 Another implementation consideration is the use of stale nameserver
336 addresses for lookups. This is mentioned explicitly because, in some
337 resolvers, getting the addresses for nameservers is a separate path
338 from a normal cache lookup. If authoritative server addresses are
339 not able to be refreshed, resolution can possibly still be successful
340 if the authoritative servers themselves are up. For instance,
341 consider an attack on a top-level domain that takes its nameservers
342 offline; serve-stale resolvers that had expired glue addresses for
343 subdomains within that top-level domain would still be able to
344 resolve names within those subdomains, even those it had not
345 previously looked up.
346
347 The directive in Section 4 that only NoError and NXDomain responses
348 should invalidate any previously associated answer stems from the
349 fact that no other RCODEs that a resolver normally encounters make
350 any assertions regarding the name in the question or any data
351 associated with it. This comports with existing resolver behavior
352 where a failed lookup (say, during prefetching) doesn't impact the
353 existing cache state. Some authoritative server operators have said
354 that they would prefer stale answers to be used in the event that
355 their servers are responding with errors like ServFail instead of
356 giving true authoritative answers. Implementers MAY decide to return
357 stale answers in this situation.
358
359 Since the goal of serve-stale is to provide resiliency for all
360 obvious errors to refresh data, these other RCODEs are treated as
361 though they are equivalent to not getting an authoritative response.
362 Although NXDomain for a previously existing name might well be an
363 error, it is not handled that way because there is no effective way
364 to distinguish operator intent for legitimate cases versus error
365 cases.
366
367 During discussion in the IETF, it was suggested that, if all
368 authorities return responses with an RCODE of Refused, it may be an
369 explicit signal to take down the zone from servers that still have
370 the zone's delegation pointed to them. Refused, however, is also
371 overloaded to mean multiple possible failures that could represent
372 transient configuration failures. Operational experience has shown
373 that purposely returning Refused is a poor way to achieve an explicit
374 takedown of a zone compared to either updating the delegation or
375 returning NXDomain with a suitable SOA for extended negative caching.
376 Implementers MAY nonetheless consider whether to treat all
377 authorities returning Refused as preempting the use of stale data.
378
3797. Implementation Caveats
380
381 Stale data is used only when refreshing has failed in order to adhere
382 to the original intent of the design of the DNS and the behavior
383 expected by operators. If stale data were to always be used
384 immediately and then a cache refresh attempted after the client
385 response has been sent, the resolver would frequently be sending data
386 that it would have had no trouble refreshing. Because modern
387 resolvers use techniques like prefetching and request coalescing for
388 efficiency, it is not necessary that every client request needs to
389 trigger a new lookup flow in the presence of stale data, but rather
390 that a good-faith effort has been recently made to refresh the stale
391 data before it is delivered to any client.
392
393 It is important to continue the resolution attempt after the stale
394 response has been sent, until the query resolution timeout, because
395 some pathological resolutions can take many seconds to succeed as
396 they cope with unavailable servers, bad networks, and other problems.
397 Stopping the resolution attempt when the response with expired data
398 has been sent would mean that answers in these pathological cases
399 would never be refreshed.
400
401 The continuing prohibition against using data with a 0-second TTL
402 beyond the current transaction explicitly extends to it being
403 unusable even for stale fallback, as it is not to be cached at all.
404
405 Be aware that Canonical Name (CNAME) and DNAME records [RFC6672]
406 mingled in the expired cache with other records at the same owner
407 name can cause surprising results. This was observed with an initial
408 implementation in BIND when a hostname changed from having an IPv4
409 Address (A) record to a CNAME. The version of BIND being used did
410 not evict other types in the cache when a CNAME was received, which
411 in normal operations is not a significant issue. However, after both
412 records expired and the authorities became unavailable, the fallback
413 to stale answers returned the older A instead of the newer CNAME.
414
4158. Implementation Status
416
417 The algorithm described in Section 5 was originally implemented as a
418 patch to BIND 9.7.0. It has been in use on Akamai's production
419 network since 2011; it effectively smoothed over transient failures
420 and longer outages that would have resulted in major incidents. The
421 patch was contributed to the Internet Systems Consortium, and the
422 functionality is now available in BIND 9.12 and later via the options
423 stale-answer-enable, stale-answer-ttl, and max-stale-ttl.
424
425 Unbound has a similar feature for serving stale answers and will
426 respond with stale data immediately if it has recently tried and
427 failed to refresh the answer by prefetching. Starting from version
428 1.10.0, Unbound can also be configured to follow the algorithm
429 described in Section 5. Both behaviors can be configured and fine-
430 tuned with the available serve-expired-* options.
431
432 Knot Resolver has a demo module here: <https://knot-
433 resolver.readthedocs.io/en/stable/modules-serve_stale.html>.
434
435 Apple's system resolvers are also known to use stale answers, but the
436 details are not readily available.
437
438 In the research paper "When the Dike Breaks: Dissecting DNS Defenses
439 During DDoS" [DikeBreaks], the authors detected some use of stale
440 answers by resolvers when authorities came under attack. Their
441 research results suggest that more widespread adoption of the
442 technique would significantly improve resiliency for the large number
443 of requests that fail or experience abnormally long resolution times
444 during an attack.
445
4469. EDNS Option
447
448 During the discussion of serve-stale in the IETF, it was suggested
449 that an EDNS option [RFC6891] should be available. One proposal was
450 to use it to opt in to getting data that is possibly stale, and
451 another was to signal when stale data has been used for a response.
452
453 The opt-in use case was rejected, as the technique was meant to be
454 immediately useful in improving DNS resiliency for all clients.
455
456 The reporting case was ultimately also rejected because even the
457 simpler version of a proposed option was still too much bother to
458 implement for too little perceived value.
459
46010. Security Considerations
461
462 The most obvious security issue is the increased likelihood of DNSSEC
463 validation failures when using stale data because signatures could be
464 returned outside their validity period. Stale negative records can
465 increase the time window where newly published TLSA or DS RRs may not
466 be used due to cached NSEC or NSEC3 records. These scenarios would
467 only be an issue if the authoritative servers are unreachable (the
468 only time the techniques in this document are used), and thus serve-
469 stale does not introduce a new failure in place of what would have
470 otherwise been success.
471
472 Additionally, bad actors have been known to use DNS caches to keep
473 records alive even after their authorities have gone away. The
474 serve-stale feature potentially makes the attack easier, although
475 without introducing a new risk. In addition, attackers could combine
476 this with a DDoS attack on authoritative servers with the explicit
477 intent of having stale information cached for a longer period of
478 time. But if attackers have this capacity, they probably could do
479 much worse than prolonging the life of old data.
480
481 In [CloudStrife], it was demonstrated how stale DNS data, namely
482 hostnames pointing to addresses that are no longer in use by the
483 owner of the name, can be used to co-opt security -- for example, to
484 get domain-validated certificates fraudulently issued to an attacker.
485 While this document does not create a new vulnerability in this area,
486 it does potentially enlarge the window in which such an attack could
487 be made. A proposed mitigation is that certificate authorities
488 should fully look up each name starting at the DNS root for every
489 name lookup. Alternatively, certificate authorities should use a
490 resolver that is not serving stale data.
491
49211. Privacy Considerations
493
494 This document does not add any practical new privacy issues.
495
49612. NAT Considerations
497
498 The method described here is not affected by the use of NAT devices.
499
50013. IANA Considerations
501
502 This document has no IANA actions.
503
50414. References
505
50614.1. Normative References
507
508 [RFC1034] Mockapetris, P., "Domain names - concepts and facilities",
509 STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987,
510 <https://www.rfc-editor.org/info/rfc1034>.
511
512 [RFC1035] Mockapetris, P., "Domain names - implementation and
513 specification", STD 13, RFC 1035, DOI 10.17487/RFC1035,
514 November 1987, <https://www.rfc-editor.org/info/rfc1035>.
515
516 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
517 Requirement Levels", BCP 14, RFC 2119,
518 DOI 10.17487/RFC2119, March 1997,
519 <https://www.rfc-editor.org/info/rfc2119>.
520
521 [RFC2181] Elz, R. and R. Bush, "Clarifications to the DNS
522 Specification", RFC 2181, DOI 10.17487/RFC2181, July 1997,
523 <https://www.rfc-editor.org/info/rfc2181>.
524
525 [RFC2308] Andrews, M., "Negative Caching of DNS Queries (DNS
526 NCACHE)", RFC 2308, DOI 10.17487/RFC2308, March 1998,
527 <https://www.rfc-editor.org/info/rfc2308>.
528
529 [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
530 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
531 May 2017, <https://www.rfc-editor.org/info/rfc8174>.
532
53314.2. Informative References
534
535 [CloudStrife]
536 Borgolte, K., Fiebig, T., Hao, S., Kruegel, C., and G.
537 Vigna, "Cloud Strife: Mitigating the Security Risks of
538 Domain-Validated Certificates",
539 DOI 10.1145/3232755.3232859, ACM 2018 Applied Networking
540 Research Workshop, July 2018, <https://www.ndss-
541 symposium.org/wp-content/uploads/2018/02/ndss2018_06A-
542 4_Borgolte_paper.pdf>.
543
544 [DikeBreaks]
545 Moura, G.C.M., Heidemann, J., Müller, M., Schmidt, R. de
546 O., and M. Davids, "When the Dike Breaks: Dissecting DNS
547 Defenses During DDoS", DOI 10.1145/3278532.3278534,
548 ACM 2018 Internet Measurement Conference, October 2018,
549 <https://www.isi.edu/~johnh/PAPERS/Moura18b.pdf>.
550
551 [DITL] DNS-OARC, "DITL Traces and Analysis", January 2018,
552 <https://www.dns-oarc.net/oarc/data/ditl>.
553
554 [RFC6672] Rose, S. and W. Wijngaards, "DNAME Redirection in the
555 DNS", RFC 6672, DOI 10.17487/RFC6672, June 2012,
556 <https://www.rfc-editor.org/info/rfc6672>.
557
558 [RFC6891] Damas, J., Graff, M., and P. Vixie, "Extension Mechanisms
559 for DNS (EDNS(0))", STD 75, RFC 6891,
560 DOI 10.17487/RFC6891, April 2013,
561 <https://www.rfc-editor.org/info/rfc6891>.
562
563 [RFC8499] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS
564 Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499,
565 January 2019, <https://www.rfc-editor.org/info/rfc8499>.
566
567Acknowledgements
568
569 The authors wish to thank Brian Carpenter, Vladimir Cunat, Robert
570 Edmonds, Tony Finch, Bob Harold, Tatuya Jinmei, Matti Klock, Jason
571 Moreau, Giovane Moura, Jean Roy, Mukund Sivaraman, Davey Song, Paul
572 Vixie, Ralf Weber, and Paul Wouters for their review and feedback.
573 Paul Hoffman deserves special thanks for submitting a number of Pull
574 Requests.
575
576 Thank you also to the following members of the IESG for their final
577 review: Roman Danyliw, Benjamin Kaduk, Suresh Krishnan, Mirja
578 Kühlewind, and Adam Roach.
579
580Authors' Addresses
581
582 David C Lawrence
583 Oracle
584
585 Email: tale@dd.org
586
587
588 Warren "Ace" Kumari
589 Google
590 1600 Amphitheatre Parkway
591 Mountain View, CA 94043
592 United States of America
593
594 Email: warren@kumari.net
595
596
597 Puneet Sood
598 Google
599
600 Email: puneets@google.com
601