summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc5393.txt
blob: e0b46c5386ca4ce9bcb2465256e4234a9449cd41 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
Network Working Group                                     R. Sparks, Ed.
Request for Comments: 5393                                       Tekelec
Updates: 3261                                                S. Lawrence
Category: Standards Track                          Nortel Networks, Inc.
                                                          A. Hawrylyshen
                                                    Ditech Networks Inc.
                                                               B. Campen
                                                                 Tekelec
                                                           December 2008


               Addressing an Amplification Vulnerability
          in Session Initiation Protocol (SIP) Forking Proxies

Status of This Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (c) 2008 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (http://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights
   and restrictions with respect to this document.

Abstract

   This document normatively updates RFC 3261, the Session Initiation
   Protocol (SIP), to address a security vulnerability identified in SIP
   proxy behavior.  This vulnerability enables an attack against SIP
   networks where a small number of legitimate, even authorized, SIP
   requests can stimulate massive amounts of proxy-to-proxy traffic.

   This document strengthens loop-detection requirements on SIP proxies
   when they fork requests (that is, forward a request to more than one
   destination).  It also corrects and clarifies the description of the
   loop-detection algorithm such proxies are required to implement.
   Additionally, this document defines a Max-Breadth mechanism for
   limiting the number of concurrent branches pursued for any given
   request.



Sparks, et al.              Standards Track                     [Page 1]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


Table of Contents

   1. Introduction ....................................................3
   2. Conventions and Definitions .....................................3
   3. Vulnerability: Leveraging Forking to Flood a Network ............3
   4. Updates to RFC 3261 .............................................7
      4.1. Strengthening the Requirement to Perform Loop Detection ....7
      4.2. Correcting and Clarifying the RFC 3261
           Loop-Detection Algorithm ...................................7
           4.2.1. Update to Section 16.6 ..............................7
           4.2.2. Update to Section 16.3 ..............................8
           4.2.3. Impact of Loop Detection on Overall Network
                  Performance .........................................9
           4.2.4. Note to Implementers ................................9
   5. Max-Breadth ....................................................10
      5.1. Overview ..................................................10
      5.2. Examples ..................................................11
      5.3. Formal Mechanism ..........................................12
           5.3.1. Max-Breadth Header Field ...........................12
           5.3.2. Terminology ........................................13
           5.3.3. Proxy Behavior .....................................13
                  5.3.3.1. Reusing Max-Breadth .......................14
           5.3.4. UAC Behavior .......................................14
           5.3.5. UAS Behavior .......................................14
      5.4. Implementer Notes .........................................14
           5.4.1. Treatment of CANCEL ................................14
           5.4.2. Reclamation of Max-Breadth on 2xx Responses ........14
           5.4.3. Max-Breadth and Automaton UAs ......................14
      5.5. Parallel and Sequential Forking ...........................15
      5.6. Max-Breadth Split Weight Selection ........................15
      5.7. Max-Breadth's Effect on Forking-Based
           Amplification Attacks .....................................15
      5.8. Max-Breadth Header Field ABNF Definition ..................16
   6. IANA Considerations ............................................16
      6.1. Max-Breadth Header Field ..................................16
      6.2. 440 Max-Breadth Exceeded Response .........................16
   7. Security Considerations ........................................16
      7.1. Alternate Solutions That Were Considered and Rejected .....17
   8. Acknowledgments ................................................19
   9. References .....................................................19
      9.1. Normative References ......................................19
      9.2. Informative References ....................................19









Sparks, et al.              Standards Track                     [Page 2]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


1.  Introduction

   Interoperability testing uncovered a vulnerability in the behavior of
   forking SIP proxies as defined in [RFC3261].  This vulnerability can
   be leveraged to cause a small number of valid SIP requests to
   generate an extremely large number of proxy-to-proxy messages.  A
   version of this attack demonstrates fewer than ten messages
   stimulating potentially 2^71 messages.

   This document specifies normative changes to the SIP protocol to
   address this vulnerability.  According to this update, when a SIP
   proxy forks a request to more than one destination, it is required to
   ensure it is not participating in a request loop.

   This normative update alone is insufficient to protect against
   crafted variations of the attack described here involving multiple
   Addresses of Record (AORs).  To further address the vulnerability,
   this document defines the Max-Breadth mechanism to limit the total
   number of concurrent branches caused by a forked SIP request.  The
   mechanism only limits concurrency.  It does not limit the total
   number of branches a request can traverse over its lifetime.

   The mechanisms in this update will protect against variations of the
   attack described here that use a small number of resources, including
   most unintentional self-inflicted variations that occur through
   accidental misconfiguration.  However, an attacker with access to a
   sufficient number of distinct resources will still be able to
   stimulate a very large number of messages.  The number of concurrent
   messages will be limited by the Max-Breadth mechanism, so the entire
   set will be spread out over a long period of time, giving operators
   better opportunity to detect the attack and take corrective measures
   outside the protocol.  Future protocol work is needed to prevent this
   form of the attack.

2.  Conventions and Definitions

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in RFC 2119 [RFC2119].

3.  Vulnerability: Leveraging Forking to Flood a Network

   This section describes setting up an attack with a simplifying
   assumption: that two accounts on each of two different RFC 3261
   compliant proxy/registrar servers that do not perform loop detection
   are available to an attacker.  This assumption is not necessary for
   the attack but makes representing the scenario simpler.  The same
   attack can be realized with a single account on a single server.



Sparks, et al.              Standards Track                     [Page 3]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   Consider two proxy/registrar services, P1 and P2, and four Addresses
   of Record, a@P1, b@P1, a@P2, and b@P2.  Using normal REGISTER
   requests, establish bindings to these AORs as follows (non-essential
   details elided):

           REGISTER sip:P1 SIP/2.0
           To: <sip:a@P1>
           Contact: <sip:a@P2>, <sip:b@P2>

           REGISTER sip:P1 SIP/2.0
           To: <sip:b@P1>
           Contact: <sip:a@P2>, <sip:b@P2>

           REGISTER sip:P2 SIP/2.0
           To: <sip:a@P2>
           Contact: <sip:a@P1>, <sip:b@P1>

           REGISTER sip:P2 SIP/2.0
           To: <sip:b@P2>
           Contact: <sip:a@P1>, <sip:b@P1>

   With these bindings in place, introduce an INVITE request to any of
   the four AORs, say a@P1.  This request will fork to two requests
   handled by P2, which will fork to four requests handled by P1, which
   will fork to eight messages handled by P2, and so on.  This message
   flow is represented in Figure 1.

                                       |
                                     a@P1
                                   /       \
                                 /           \
                               /               \
                             /                   \
                          a@P2                   b@P2
                          /  \                   /  \
                        /      \               /      \
                       /        \             /        \
                     a@P1       b@P1        a@P1       b@P1
                     /  \       /  \        /  \       /  \
                  a@P2  b@P2 a@P2  b@P2  a@P2  b@P2 a@P2  b@P2
                   /\    /\   /\    /\    /\    /\   /\    /\
                                       .
                                       .
                                       .

                   Figure 1: Attack Request Propagation





Sparks, et al.              Standards Track                     [Page 4]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   Requests will continue to propagate down this tree until Max-Forwards
   reaches zero.  If the endpoint and two proxies involved follow RFC
   3261 recommendations, the tree will be 70 rows deep, representing
   2^71-1 requests.  The actual number of messages may be much larger if
   the time to process the entire tree's worth of requests is longer
   than Timer C at either proxy.  In this case, a storm of 408 responses
   and/or a storm of CANCEL requests will also be propagating through
   the tree along with the INVITE requests.  Remember that there are
   only two proxies involved in this scenario - each having to hold the
   state for all the transactions it sees (at least 2^70 simultaneously
   active transactions near the end of the scenario).

   The attack can be simplified to one account at one server if the
   service can be convinced that contacts with varying attributes
   (parameters, schemes, embedded headers) are sufficiently distinct,
   and these parameters are not used as part of AOR comparisons when
   forwarding a new request.  Since RFC 3261 mandates that all URI
   parameters must be removed from a URI before looking it up in a
   location service and that the URIs from the Contact header field are
   compared using URI equality, the following registration should be
   sufficient to set up this attack using a single REGISTER request to a
   single account:

   REGISTER sip:P1 SIP/2.0
   To: <sip:a@P1>
   Contact: <sip:a@P1;unknown-param=whack>,<sip:a@P1;unknown-param=thud>

   This attack was realized in practice during one of the SIP
   Interoperability Test (SIPit) sessions.  The scenario was extended to
   include more than two proxies, and the participating proxies all
   limited Max-Forwards to be no larger than 20.  After a handful of
   messages to construct the attack, the participating proxies began
   bombarding each other.  Extrapolating from the several hours the
   experiment was allowed to run, the scenario would have completed in
   just under 10 days.  Had the proxies used the RFC 3261 recommended
   Max-Forwards value of 70, and assuming they performed linearly as the
   state they held increased, it would have taken 3 trillion years to
   complete the processing of the single INVITE request that initiated
   the attack.  It is interesting to note that a few proxies rebooted
   during the scenario and rejoined in the attack when they restarted
   (as long as they maintained registration state across reboots).  This
   points out that if this attack were launched on the Internet at
   large, it might require coordination among all the affected elements
   to stop it.

   Loop detection, as specified in this document, at any of the proxies
   in the scenarios described so far would have stopped the attack
   immediately.  (If all the proxies involved implemented this loop



Sparks, et al.              Standards Track                     [Page 5]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   detection, the total number of stimulated messages in the first
   scenario described would be reduced to 14; in the variation involving
   one server, the number of stimulated messages would be reduced to
   10.)  However, there is a variant of the attack that uses multiple
   AORs where loop detection alone is insufficient protection.  In this
   variation, each participating AOR forks to all the other
   participating AORs.  For small numbers of participating AORs (10, for
   example), paths through the resulting tree will not loop until very
   large numbers of messages have been generated.  Acquiring a
   sufficient number of AORs to launch such an attack on networks
   currently available is quite feasible.

   In this scenario, requests will often take many hops to complete a
   loop, and there are a very large number of different loops that will
   occur during the attack.  In fact, if N is the number of
   participating AORs, and provided N is less than or equal to Max-
   Forwards, the amount of traffic generated by the attack is greater
   than N!, even if all proxies involved are performing loop detection.

   Suppose we have a set of N AORs, all of which are set up to fork to
   the entire set.  For clarity, assume AOR 1 is where the attack
   begins.  Every permutation of the remaining N-1 AORs will play out,
   defining (N-1)! distinct paths, without repeating any AOR.  Then,
   each of these paths will fork N ways one last time, and a loop will
   be detected on each of these branches.  These final branches alone
   total N! requests ((N-1)! paths, with N forks at the end of each
   path).

                        ___N____Requests_
                        |  1 |         1 |
                        |  2 |         4 |
                        |  3 |        15 |
                        |  4 |        64 |
                        |  5 |       325 |
                        |  6 |      1956 |
                        |  7 |     13699 |
                        |  8 |    109600 |
                        |  9 |    986409 |
                        | 10 |   9864100 |


            Forwarded Requests vs. Number of Participating AORs

   In a network where all proxies are performing loop detection, an
   attacker is still afforded rapidly increasing returns on the number
   of AORs they are able to leverage.  The Max-Breadth mechanism defined
   in this document is designed to limit the effectiveness of this
   variation of the attack.



Sparks, et al.              Standards Track                     [Page 6]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   In all of the scenarios, it is important to notice that at each
   forking proxy, an additional branch could be added pointing to a
   single victim (that might not even be a SIP-aware element), resulting
   in a massive amount of traffic being directed towards the victim from
   potentially as many sources as there are AORs participating in the
   attack.

4.  Updates to RFC 3261

4.1.  Strengthening the Requirement to Perform Loop Detection

   The following requirements mitigate the risk of a proxy falling
   victim to the attack described in this document.

   When a SIP proxy forks a particular request to more than one
   location, it MUST ensure that request is not looping through this
   proxy.  It is RECOMMENDED that proxies meet this requirement by
   performing the loop-detection steps defined in this document.

   The requirement to use this document's refinement of the loop-
   detection algorithm from RFC 3261 is set at should-strength to allow
   for future Standards-Track mechanisms that will allow a proxy to
   determine it is not looping.  For example, a proxy forking to
   destinations established using the sip-outbound mechanism [OUTBOUND]
   would know those branches will not loop.

   A SIP proxy forwarding a request to only one location MAY perform
   loop detection but is not required to.  When forwarding to only one
   location, the amplification risk being exploited is not present, and
   the Max-Forwards mechanism will protect the network to the extent it
   was designed (always keep in mind the constant multiplier due to
   exhausting Max-Forwards while not forking).  A proxy is not required
   to perform loop detection when forwarding a request to a single
   location even if it happened to have previously forked that request
   (and performed loop detection) in its progression through the
   network.

4.2.  Correcting and Clarifying the RFC 3261 Loop-Detection Algorithm

4.2.1.  Update to Section 16.6

   This section replaces all of item 8 in Section 16.6 of RFC 3261 (item
   8 begins on page 105 and ends on page 106 of RFC 3261).








Sparks, et al.              Standards Track                     [Page 7]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   8.  Add a Via Header Field Value

   The proxy MUST insert a Via header field value into the copy before
   the existing Via header field values.  The construction of this value
   follows the same guidelines of Section 8.1.1.7.  This implies that
   the proxy will compute its own branch parameter, which will be
   globally unique for that branch, and will contain the requisite magic
   cookie.  Note that following only the guidelines in Section 8.1.1.7
   will result in a branch parameter that will be different for
   different instances of a spiraled or looped request through a proxy.

   Proxies required to perform loop detection by RFC 5393 have an
   additional constraint on the value they place in the Via header
   field.  Such proxies SHOULD create a branch value separable into two
   parts in any implementation-dependent way.

   The remainder of this section's description assumes the existence of
   these two parts.  If a proxy chooses to employ some other mechanism,
   it is the implementer's responsibility to verify that the detection
   properties defined by the requirements placed on these two parts are
   achieved.

   The first part of the branch value MUST satisfy the constraints of
   Section 8.1.1.7.  The second part is used to perform loop detection
   and distinguish loops from spirals.

   This second part MUST vary with any field used by the location
   service logic in determining where to retarget or forward this
   request.  This is necessary to distinguish looped requests from
   spirals by allowing the proxy to recognize if none of the values
   affecting the processing of the request have changed.  Hence, the
   second part MUST depend at least on the received Request-URI and any
   Route header field values used when processing the received request.
   Implementers need to take care to include all fields used by the
   location service logic in that particular implementation.

   This second part MUST NOT vary with the request method.  CANCEL and
   non-200 ACK requests MUST have the same branch parameter value as the
   corresponding request they cancel or acknowledge.  This branch
   parameter value is used in correlating those requests at the server
   handling them (see Sections 17.2.3 and 9.2).

4.2.2.  Update to Section 16.3

   This section replaces all of item 4 in Section 16.3 of RFC 3261 (item
   4 appears on page 95 of RFC 3261).





Sparks, et al.              Standards Track                     [Page 8]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   4.  Loop-Detection Check

   Proxies required to perform loop detection by RFC 5393 MUST perform
   the following loop-detection test before forwarding a request.  Each
   Via header field value in the request whose sent-by value matches a
   value placed into previous requests by this proxy MUST be inspected
   for the "second part" defined in Section 4.2.1 of RFC 5393.  This
   second part will not be present if the message was not forked when
   that Via header field value was added.  If the second field is
   present, the proxy MUST perform the second-part calculation described
   in Section 4.2.1 of RFC 5393 on this request and compare the result
   to the value from the Via header field.  If these values are equal,
   the request has looped and the proxy MUST reject the request with a
   482 (Loop Detected) response.  If the values differ, the request is
   spiraling and processing continues to the next step.

4.2.3.  Impact of Loop Detection on Overall Network Performance

   These requirements and the recommendation to use the loop-detection
   mechanisms in this document make the favorable trade of exponential
   message growth for work that is, at worst, order n^2 as a message
   crosses n proxies.  Specifically, this work is order m*n where m is
   the number of proxies in the path that fork the request to more than
   one location.  In practice, m is expected to be small.

   The loop-detection algorithm expressed in this document requires a
   proxy to inspect each Via element in a received request.  In the
   worst case, where a message crosses N proxies, each of which loop
   detect, proxy k does k inspections, and the overall number of
   inspections spread across the proxies handling this request is the
   sum of k from k=1 to k=N which is N(N+1)/2.

4.2.4.  Note to Implementers

   A common way to create the second part of the branch parameter value
   when forking a request is to compute a hash over the concatenation of
   the Request-URI, any Route header field values used during processing
   the request, and any other values used by the location service logic
   while processing this request.  The hash should be chosen so that
   there is a low probability that two distinct sets of these parameters
   will collide.  Because the maximum number of inputs that need to be
   compared is 70, the chance of a collision is low even with a
   relatively small hash value, such as 32 bits.  CRC-32c as specified
   in [RFC4960] is a specific acceptable function, as is MD5 [RFC1321].
   Note that MD5 is being chosen purely for non-cryptographic
   properties.  An attacker who can control the inputs in order to
   produce a hash collision can attack the connection in a variety of
   other ways.  When forming the second part using a hash,



Sparks, et al.              Standards Track                     [Page 9]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   implementations SHOULD include at least one field in the input to the
   hash that varies between different transactions attempting to reach
   the same destination to avoid repeated failure should the hash
   collide.  The Call-ID and CSeq fields would be good inputs for this
   purpose.

   A common point of failure to interoperate at SIPit events has been
   due to parsers objecting to the contents of another element's Via
   header field values when inspecting the Via stack for loops.
   Implementers need to take care to avoid making assumptions about the
   format of another element's Via header field value beyond the basic
   constraints placed on that format by RFC 3261.  In particular,
   parsing a header field value with unknown parameter names, parameters
   with no values, or parameter values with or without quoted strings
   must not cause an implementation to fail.

   Removing, obfuscating, or in any other way modifying the branch
   parameter values in Via header fields in a received request before
   forwarding it removes the ability for the node that placed that
   branch parameter into the message to perform loop detection.  If two
   elements in a loop modify branch parameters this way, a loop can
   never be detected.

5.  Max-Breadth

5.1.  Overview

   The Max-Breadth mechanism defined here limits the total number of
   concurrent branches caused by a forked SIP request.  With this
   mechanism, all proxyable requests are assigned a positive integral
   Max-Breadth value, which denotes the maximum number of concurrent
   branches this request may spawn through parallel forking as it is
   forwarded from its current point.  When a proxy forwards a request,
   its Max-Breadth value is divided among the outgoing requests.  In
   turn, each of the forwarded requests has a limit on how many
   concurrent branches it may spawn.  As branches complete, their
   portion of the Max-Breadth value becomes available for subsequent
   branches, if needed.  If there is insufficient Max-Breadth to carry
   out a desired parallel fork, a proxy can return the 440 (Max-Breadth
   Exceeded) response defined in this document.

   This mechanism operates independently from Max-Forwards.  Max-
   Forwards limits the depth of the tree a request may traverse as it is
   forwarded from its origination point to each destination it is forked
   to.  As Section 3 shows, the number of branches in a tree of even
   limited depth can be made large (exponential with depth) by
   leveraging forking.  Each such branch has a pair of SIP transaction




Sparks, et al.              Standards Track                    [Page 10]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   state machines associated with it.  The Max-Breadth mechanism limits
   the number of branches that are active (those that have running
   transaction state machines) at any given point in time.

   Max-Breadth does not prevent forking.  It only limits the number of
   concurrent parallel forked branches.  In particular, a Max-Breadth of
   1 restricts a request to pure serial forking rather than restricting
   it from being forked at all.

   A client receiving a 440 (Max-Breadth Exceeded) response can infer
   that its request did not reach all possible destinations.  Recovery
   options are similar to those when receiving a 483 (Too Many Hops)
   response, and include affecting the routing decisions through
   whatever mechanisms are appropriate to result in a less broad search,
   or refining the request itself before submission to make the search
   space smaller.

5.2.  Examples

    UAC                 Proxy A              Proxy B             Proxy C
     | INVITE              |                    |                   |
     | Max-Breadth: 60     | INVITE             |                   |
     | Max-Forwards: 70    | Max-Breadth: 30    |                   |
     |-------------------->| Max-Forwards: 69   |                   |
     |                     |------------------->|                   |
     |                     | INVITE             |                   |
     |                     | Max-Breadth: 30    |                   |
     |                     | Max-Forwards: 69   |                   |
     |                     |--------------------------------------->|
     |                     |                    |                   |

                             Parallel Forking

    UAC                 Proxy A              Proxy B             Proxy C
     | INVITE              |                    |                   |
     | Max-Breadth: 60     | INVITE             |                   |
     | Max-Forwards: 70    | Max-Breadth: 60    |                   |
     |-------------------->| Max-Forwards: 69   |                   |
     |                     |------------------->|                   |
     |                     | some error response|                   |
     |                     |<-------------------|                   |
     |                     | INVITE             |                   |
     |                     | Max-Breadth: 60    |                   |
     |                     | Max-Forwards: 69   |                   |
     |                     |--------------------------------------->|
     |                     |                    |                   |

                            Sequential Forking



Sparks, et al.              Standards Track                    [Page 11]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


    UAC                 Proxy A              Proxy B             Proxy C
     | INVITE              |                    |                   |
     | Max-Breadth: 60     | INVITE             |                   |
     | Max-Forwards: 70    | Max-Breadth: 60    | INVITE            |
     |-------------------->| Max-Forwards: 69   | Max-Breadth: 60   |
     |                     |------------------->| Max-Forwards: 68  |
     |                     |                    |------------------>|
     |                     |                    |                   |
     |                     |                    |                   |
     |                     |                    |                   |

                                No Forking


              MB == Max-Breadth               MF == Max-Forwards

                                    | MB: 4
                                    | MF: 5
                         MB: 2      P            MB: 2
                         MF: 4    /  \           MF: 4
                 +---------------+    +------------------+
         MB: 1   P    MB: 1                     MB: 1    P    MB: 1
         MF: 3 /  \   MF: 3                     MF: 3  /  \   MF: 3
          +---+    +-------+                     +----+    +-------+
          P                P                     P                 P
    MB: 1 |          MB: 1 |               MB: 1 |           MB: 1 |
    MF: 2 |          MF: 2 |               MF: 2 |           MF: 2 |
          P                P                     P                 P
    MB: 1 |          MB: 1 |               MB: 1 |           MB: 1 |
    MF: 1 |          MF: 1 |               MF: 1 |           MF: 1 |
          P                P                     P                 P
                                     .
                                     .
                                     .

               Max-Breadth and Max-Forwards Working Together

5.3.  Formal Mechanism

5.3.1.  Max-Breadth Header Field

   The Max-Breadth header field takes a single positive integer as its
   value.  The Max-Breadth header field value takes no parameters.








Sparks, et al.              Standards Track                    [Page 12]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


5.3.2.  Terminology

   For each "response context" (see Section 16 of [RFC3261]) in a proxy,
   this mechanism defines two positive integral values: Incoming Max-
   Breadth and Outgoing Max-Breadth.  Incoming Max-Breadth is the value
   in the Max-Breadth header field in the request that formed the
   response context.  Outgoing Max-Breadth is the sum of the Max-Breadth
   header field values in all forwarded requests in the response context
   that have not received a final response.

5.3.3.  Proxy Behavior

   If a SIP proxy receives a request with no Max-Breadth header field
   value, it MUST add one, with a value that is RECOMMENDED to be 60.
   Proxies MUST have a maximum allowable Incoming Max-Breadth value,
   which is RECOMMENDED to be 60.  If this maximum is exceeded in a
   received request, the proxy MUST overwrite it with a value that
   SHOULD be no greater than its allowable maximum.

   All proxied requests MUST contain a single Max-Breadth header field
   value.

   SIP proxies MUST NOT allow the Outgoing Max-Breadth to exceed the
   Incoming Max-Breadth in a given response context.

   If a SIP proxy determines a response context has insufficient
   Incoming Max-Breadth to carry out a desired parallel fork, and the
   proxy is unwilling/unable to compensate by forking serially or
   sending a redirect, that proxy MUST return a 440 (Max-Breadth
   Exceeded) response.

   Notice that these requirements mean a proxy receiving a request with
   a Max-Breadth of 1 can only fork serially, but it is not required to
   fork at all -- it can return a 440 instead.  Thus, this mechanism is
   not a tool a user agent can use to force all proxies in the path of a
   request to fork serially.

   A SIP proxy MAY distribute Max-Breadth in an arbitrary fashion
   between active branches.  A proxy SHOULD NOT use a smaller amount of
   Max-Breadth than was present in the original request unless the
   Incoming Max-Breadth exceeded the proxy's maximum acceptable value.
   A proxy MUST NOT decrement Max-Breadth for each hop or otherwise use
   it to restrict the "depth" of a request's propagation.








Sparks, et al.              Standards Track                    [Page 13]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


5.3.3.1.  Reusing Max-Breadth

   Because forwarded requests that have received a final response do not
   count towards the Outgoing Max-Breadth, whenever a final response
   arrives, the Max-Breadth that was used on that branch becomes
   available for reuse.  Proxies SHOULD be prepared to reuse this Max-
   Breadth in cases where there may be elements left in the target-set.

5.3.4.  UAC Behavior

   A User Agent Client (UAC) MAY place a Max-Breadth header field value
   in outgoing requests.  If so, this value is RECOMMENDED to be 60.

5.3.5.  UAS Behavior

   This mechanism does not affect User Agent Server (UAS) behavior.  A
   UAS receiving a request with a Max-Breadth header field will ignore
   that field while processing the request.

5.4.  Implementer Notes

5.4.1.  Treatment of CANCEL

   Since CANCEL requests are never proxied, a Max-Breadth header field
   value is meaningless in a CANCEL request.  Sending a CANCEL in no way
   affects the Outgoing Max-Breadth in the associated INVITE response
   context.  Receiving a CANCEL in no way affects the Incoming Max-
   Breadth of the associated INVITE response context.

5.4.2.  Reclamation of Max-Breadth on 2xx Responses

   Whether 2xx responses free up Max-Breadth is mostly a moot issue,
   since proxies are forbidden to start new branches in this case.  But,
   there is one caveat.  A proxy may receive multiple 2xx responses for
   a single forwarded INVITE request.  Also, [RFC2543] implementations
   may send back a 6xx followed by a 2xx on the same branch.
   Implementations that subtract from the Outgoing Max-Breadth when they
   receive a 2xx response to an INVITE request must be careful to avoid
   bugs caused by subtracting multiple times for a single branch.

5.4.3.  Max-Breadth and Automaton UAs

   Designers of automaton user agents (UAs) (including B2BUAs, gateways,
   exploders, and any other element that programmatically sends requests
   as a result of incoming SIP traffic) should consider whether Max-
   Breadth limitations should be placed on outgoing requests.  For
   example, it is reasonable to design B2BUAs to carry the Max-Breadth
   value from incoming requests into requests that are sent as a result.



Sparks, et al.              Standards Track                    [Page 14]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   Also, it is reasonable to place Max-Breadth constraints on sets of
   requests sent by exploders when they may be leveraged in an
   amplification attack.

5.5.  Parallel and Sequential Forking

   Inherent in the definition of this mechanism is the ability of a
   proxy to reclaim apportioned Max-Breadth while forking sequentially.
   The limitation on outgoing Max-Breadth is applied to concurrent
   branches only.

   For example, if a proxy receives a request with a Max-Breadth of 4
   and has 8 targets to forward it to, that proxy may parallel fork to 4
   of these targets initially (each with a Max-Breadth of 1, totaling an
   Outgoing Max-Breadth of 4).  If one of these transactions completes
   with a failure response, the outgoing Max-Breadth drops to 3,
   allowing the proxy to forward to one of the 4 remaining targets
   (again, with a Max-Breadth of 1).

5.6.  Max-Breadth Split Weight Selection

   There are a variety of mechanisms for controlling the weight of each
   fork branch.  Fork branches that are given more Max-Breadth are more
   likely to complete quickly (because it is less likely that a proxy
   down the line will be forced to fork sequentially).  By the same
   token, if it is known that a given branch will not fork later on, a
   Max-Breadth of 1 may be assigned with no ill effect.  This would be
   appropriate, for example, if a proxy knows the branch is using the
   SIP outbound extension [OUTBOUND].

5.7.  Max-Breadth's Effect on Forking-Based Amplification Attacks

   Max-Breadth limits the total number of active branches spawned by a
   given request at any one time, while placing no constraint on the
   distance (measured in hops) that the request can propagate. (i.e.,
   receiving a request with a Max-Breadth of 1 means that any forking
   must be sequential, not that forking is forbidden)

   This limits the effectiveness of any amplification attack that
   leverages forking because the amount of state/bandwidth needed to
   process the traffic at any given point in time is capped.










Sparks, et al.              Standards Track                    [Page 15]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


5.8.  Max-Breadth Header Field ABNF Definition

   This specification extends the grammar for the Session Initiation
   Protocol by adding an extension-header.  The ABNF [RFC5234]
   definition is as follows.

   Max-Breadth  =  "Max-Breadth" HCOLON 1*DIGIT

6.  IANA Considerations

   This specification registers a new SIP header field and a new SIP
   response according to the processes defined in [RFC3261].

6.1.  Max-Breadth Header Field

   This information appears in the Header Fields sub-registry of the SIP
   Parameters registry.

   RFC 5393 (this specification)

   Header Field Name: Max-Breadth

   Compact Form: none

6.2.  440 Max-Breadth Exceeded Response

   This information appears in the Response Codes sub-registry of the
   SIP Parameters registry.

   Response code: 440

   Default Reason Phrase: Max-Breadth Exceeded

7.  Security Considerations

   This document is entirely about documenting and addressing a
   vulnerability in SIP proxies as defined by RFC 3261 that can lead to
   an exponentially growing message exchange attack.

   The Max-Breadth mechanism defined here does not decrease the
   aggregate traffic caused by the forking-loop attack.  It only serves
   to spread the traffic caused by the attack over a longer period by
   limiting the number of concurrent branches that are being processed
   at the same time.  An attacker could pump multiple requests into a
   network that uses the Max-Breadth mechanism and gradually build
   traffic to unreasonable levels.  Deployments should monitor carefully
   and react to gradual increases in the number of concurrent
   outstanding transactions related to a given resource to protect



Sparks, et al.              Standards Track                    [Page 16]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


   against this possibility.  Operators should anticipate being able to
   temporarily disable any resources identified as being used in such an
   attack.  A rapid increase in outstanding concurrent transactions
   system-wide may be an indication of the presence of this kind of
   attack across many resources.  Deployments in which it is feasible
   for an attacker to obtain a very large number of resources are
   particularly at risk.  If detecting and intervening in each instance
   of the attack is insufficient to reduce the load, overload may occur.

   Implementers and operators are encouraged to follow the
   recommendations being developed for handling overload conditions (see
   [REQS] and [DESIGN]).

   Designers of protocol gateways should consider the implications of
   this kind of attack carefully.  As an example, if a message transits
   from a SIP network into the Public Switched Telephone Network (PSTN)
   and subsequently back into a SIP network, and information about the
   history of the request on either side of the protocol translation is
   lost, it becomes possible to construct loops that neither Max-
   Forwards nor loop detection can protect against.  This, combined with
   forking amplification on the SIP side of the loop, will result in an
   attack as described in this document that the mechanisms here will
   not abate, not even to the point of limiting the number of concurrent
   messages in the attack.  These considerations are particularly
   important for designers of gateways from SIP to SIP (as found in
   B2BUAs, for example).  Many existing B2BUA implementations are under
   some pressure to hide as much information about the two sides
   communicating with them as possible.  Implementers of such
   implementations may be tempted to remove the data that might be used
   by the loop-detection, Max-Forwards, or Max-Breadth mechanisms at
   other points in the network, taking on the responsibility for
   detecting loops (or forms of this attack).  However, if two such
   implementations are involved in the attack, neither will be able to
   detect it.

7.1.  Alternate Solutions That Were Considered and Rejected

   Alternative solutions that were discussed include:

   Doing nothing - rely on suing the offender:   While systems that have
      accounts have logs that can be mined to locate abusers, it isn't
      clear that this provides a credible deterrent or defense against
      the attack described in this document.  Systems that don't
      recognize the situation and take corrective/preventative action
      are likely to experience failure of a magnitude that precludes
      retrieval of the records documenting the setup of the attack.  (In
      one scenario, the registrations can occur in a radically different
      time period than the INVITE transaction.  The INVITE request



Sparks, et al.              Standards Track                    [Page 17]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


      itself may have come from an innocent).  It's even possible that
      the scenario may be set up unintentionally.  Furthermore, for some
      existing deployments, the cost and audit ability of an account is
      simply an email address.  Finding someone to punish may be
      impossible.  Finally, there are individuals who will not respond
      to any threat of legal action, and the effect of even a single
      successful instance of this kind of attack would be devastating to
      a service provider.

   Putting a smaller cap on Max-Forwards:   The effect of the attack is
      exponential with respect to the initial Max-Forwards value.
      Turning this value down limits the effect of the attack.  This
      comes at the expense of severely limiting the reach of requests in
      the network, possibly to the point that existing architectures
      will begin to fail.

   Disallowing registration bindings to arbitrary contacts:   The way
      registration binding is currently defined is a key part of the
      success of the kind of attack documented here.  The alternative of
      limiting registration bindings to allow only binding to the
      network element performing the registration, perhaps to the
      extreme of ignoring bits provided in the Contact in favor of
      transport artifacts observed in the registration request, has been
      discussed (particularly in the context of the mechanisms being
      defined in [OUTBOUND]).  Mechanisms like this may be considered
      again in the future, but are currently insufficiently developed to
      address the present threat.

   Deprecate forking:   This attack does not exist in a system that
      relies entirely on redirection and initiation of new requests by
      the original endpoint.  Removing such a large architectural
      component from the system at this time was deemed too extreme a
      solution.

   Don't reclaim breadth:  An alternative design of the Max-Breadth
      mechanism that was considered and rejected was to not allow the
      breadth from completed branches to be reused (see
      Section 5.3.3.1).  Under this alternative, an introduced request
      would cause, at most, the initial value of Max-Breadth
      transactions to be generated in the network.  While that approach
      limits any variant of the amplification vulnerability described
      here to a constant multiplier, it would dramatically change the
      potential reach of requests, and there is belief that it would
      break existing deployments.







Sparks, et al.              Standards Track                    [Page 18]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


8.  Acknowledgments

   Thanks go to the implementers that subjected their code to this
   scenario and helped analyze the results at SIPit 17.  Eric Rescorla
   provided guidance and text for the hash recommendation note.

9.  References

9.1.  Normative References

   [RFC2119]   Bradner, S., "Key words for use in RFCs to Indicate
               Requirement Levels", BCP 14, RFC 2119, March 1997.

   [RFC3261]   Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston,
               A., Peterson, J., Sparks, R., Handley, M., and E.
               Schooler, "SIP: Session Initiation Protocol", RFC 3261,
               June 2002.

   [RFC5234]   Crocker, D. and P. Overell, "Augmented BNF for Syntax
               Specifications: ABNF", STD 68, RFC 5234, January 2008.

9.2.  Informative References

   [DESIGN]    Hilt, V., "Design Considerations for Session Initiation
               Protocol (SIP) Overload Control", Work in Progress,
               July 2008.

   [OUTBOUND]  Jennings, C. and R. Mahy, "Managing Client Initiated
               Connections in the Session Initiation Protocol (SIP)",
               Work in Progress, October 2008.

   [REQS]      Rosenberg, J., "Requirements for Management of Overload
               in the Session Initiation Protocol", Work in Progress,
               July 2008.

   [RFC1321]   Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321,
               April 1992.

   [RFC2543]   Handley, M., Schulzrinne, H., Schooler, E., and J.
               Rosenberg, "SIP: Session Initiation Protocol", RFC 2543,
               March 1999.

   [RFC4960]   Stewart, R., "Stream Control Transmission Protocol",
               RFC 4960, September 2007.







Sparks, et al.              Standards Track                    [Page 19]
^L
RFC 5393           Amplification Vulnerability in SIP      December 2008


Authors' Addresses

   Robert Sparks (editor)
   Tekelec
   17210 Campbell Road
   Suite 250
   Dallas, Texas  75254-4203
   USA

   EMail: RjS@nostrum.com


   Scott Lawrence
   Nortel Networks, Inc.
   600 Technology Park
   Billerica, MA  01821
   USA

   Phone: +1 978 288 5508
   EMail: scott.lawrence@nortel.com


   Alan Hawrylyshen
   Ditech Networks Inc.
   823 E. Middlefield Rd
   Mountain View, CA  94043
   USA

   Phone: +1 650 623 1300
   EMail: alan.ietf@polyphase.ca


   Byron Campen
   Tekelec
   17210 Campbell Road
   Suite 250
   Dallas, Texas  75254-4203
   USA

   EMail: bcampen@estacado.net











Sparks, et al.              Standards Track                    [Page 20]
^L