lwt.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. {
  2. "invalid direct packet write for LWT_IN",
  3. .insns = {
  4. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  5. offsetof(struct __sk_buff, data)),
  6. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  7. offsetof(struct __sk_buff, data_end)),
  8. BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  9. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  10. BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  11. BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
  12. BPF_MOV64_IMM(BPF_REG_0, 0),
  13. BPF_EXIT_INSN(),
  14. },
  15. .errstr = "cannot write into packet",
  16. .result = REJECT,
  17. .prog_type = BPF_PROG_TYPE_LWT_IN,
  18. },
  19. {
  20. "invalid direct packet write for LWT_OUT",
  21. .insns = {
  22. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  23. offsetof(struct __sk_buff, data)),
  24. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  25. offsetof(struct __sk_buff, data_end)),
  26. BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  27. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  28. BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  29. BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
  30. BPF_MOV64_IMM(BPF_REG_0, 0),
  31. BPF_EXIT_INSN(),
  32. },
  33. .errstr = "cannot write into packet",
  34. .result = REJECT,
  35. .prog_type = BPF_PROG_TYPE_LWT_OUT,
  36. },
  37. {
  38. "direct packet write for LWT_XMIT",
  39. .insns = {
  40. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  41. offsetof(struct __sk_buff, data)),
  42. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  43. offsetof(struct __sk_buff, data_end)),
  44. BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  45. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  46. BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  47. BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
  48. BPF_MOV64_IMM(BPF_REG_0, 0),
  49. BPF_EXIT_INSN(),
  50. },
  51. .result = ACCEPT,
  52. .prog_type = BPF_PROG_TYPE_LWT_XMIT,
  53. },
  54. {
  55. "direct packet read for LWT_IN",
  56. .insns = {
  57. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  58. offsetof(struct __sk_buff, data)),
  59. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  60. offsetof(struct __sk_buff, data_end)),
  61. BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  62. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  63. BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  64. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
  65. BPF_MOV64_IMM(BPF_REG_0, 0),
  66. BPF_EXIT_INSN(),
  67. },
  68. .result = ACCEPT,
  69. .prog_type = BPF_PROG_TYPE_LWT_IN,
  70. },
  71. {
  72. "direct packet read for LWT_OUT",
  73. .insns = {
  74. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  75. offsetof(struct __sk_buff, data)),
  76. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  77. offsetof(struct __sk_buff, data_end)),
  78. BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  79. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  80. BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  81. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
  82. BPF_MOV64_IMM(BPF_REG_0, 0),
  83. BPF_EXIT_INSN(),
  84. },
  85. .result = ACCEPT,
  86. .prog_type = BPF_PROG_TYPE_LWT_OUT,
  87. },
  88. {
  89. "direct packet read for LWT_XMIT",
  90. .insns = {
  91. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  92. offsetof(struct __sk_buff, data)),
  93. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  94. offsetof(struct __sk_buff, data_end)),
  95. BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  96. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  97. BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
  98. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
  99. BPF_MOV64_IMM(BPF_REG_0, 0),
  100. BPF_EXIT_INSN(),
  101. },
  102. .result = ACCEPT,
  103. .prog_type = BPF_PROG_TYPE_LWT_XMIT,
  104. },
  105. {
  106. "overlapping checks for direct packet access",
  107. .insns = {
  108. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
  109. offsetof(struct __sk_buff, data)),
  110. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
  111. offsetof(struct __sk_buff, data_end)),
  112. BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
  113. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  114. BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
  115. BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
  116. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
  117. BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
  118. BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
  119. BPF_MOV64_IMM(BPF_REG_0, 0),
  120. BPF_EXIT_INSN(),
  121. },
  122. .result = ACCEPT,
  123. .prog_type = BPF_PROG_TYPE_LWT_XMIT,
  124. },
  125. {
  126. "make headroom for LWT_XMIT",
  127. .insns = {
  128. BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
  129. BPF_MOV64_IMM(BPF_REG_2, 34),
  130. BPF_MOV64_IMM(BPF_REG_3, 0),
  131. BPF_EMIT_CALL(BPF_FUNC_skb_change_head),
  132. /* split for s390 to succeed */
  133. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  134. BPF_MOV64_IMM(BPF_REG_2, 42),
  135. BPF_MOV64_IMM(BPF_REG_3, 0),
  136. BPF_EMIT_CALL(BPF_FUNC_skb_change_head),
  137. BPF_MOV64_IMM(BPF_REG_0, 0),
  138. BPF_EXIT_INSN(),
  139. },
  140. .result = ACCEPT,
  141. .prog_type = BPF_PROG_TYPE_LWT_XMIT,
  142. },
  143. {
  144. "invalid access of tc_classid for LWT_IN",
  145. .insns = {
  146. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
  147. offsetof(struct __sk_buff, tc_classid)),
  148. BPF_EXIT_INSN(),
  149. },
  150. .result = REJECT,
  151. .errstr = "invalid bpf_context access",
  152. },
  153. {
  154. "invalid access of tc_classid for LWT_OUT",
  155. .insns = {
  156. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
  157. offsetof(struct __sk_buff, tc_classid)),
  158. BPF_EXIT_INSN(),
  159. },
  160. .result = REJECT,
  161. .errstr = "invalid bpf_context access",
  162. },
  163. {
  164. "invalid access of tc_classid for LWT_XMIT",
  165. .insns = {
  166. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
  167. offsetof(struct __sk_buff, tc_classid)),
  168. BPF_EXIT_INSN(),
  169. },
  170. .result = REJECT,
  171. .errstr = "invalid bpf_context access",
  172. },
  173. {
  174. "check skb->tc_classid half load not permitted for lwt prog",
  175. .insns = {
  176. BPF_MOV64_IMM(BPF_REG_0, 0),
  177. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  178. BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
  179. offsetof(struct __sk_buff, tc_classid)),
  180. #else
  181. BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
  182. offsetof(struct __sk_buff, tc_classid) + 2),
  183. #endif
  184. BPF_EXIT_INSN(),
  185. },
  186. .result = REJECT,
  187. .errstr = "invalid bpf_context access",
  188. .prog_type = BPF_PROG_TYPE_LWT_IN,
  189. },