sock.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. {
  2. "skb->sk: no NULL check",
  3. .insns = {
  4. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  5. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
  6. BPF_MOV64_IMM(BPF_REG_0, 0),
  7. BPF_EXIT_INSN(),
  8. },
  9. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  10. .result = REJECT,
  11. .errstr = "invalid mem access 'sock_common_or_null'",
  12. },
  13. {
  14. "skb->sk: sk->family [non fullsock field]",
  15. .insns = {
  16. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  17. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  18. BPF_MOV64_IMM(BPF_REG_0, 0),
  19. BPF_EXIT_INSN(),
  20. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, offsetof(struct bpf_sock, family)),
  21. BPF_MOV64_IMM(BPF_REG_0, 0),
  22. BPF_EXIT_INSN(),
  23. },
  24. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  25. .result = ACCEPT,
  26. },
  27. {
  28. "skb->sk: sk->type [fullsock field]",
  29. .insns = {
  30. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  31. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  32. BPF_MOV64_IMM(BPF_REG_0, 0),
  33. BPF_EXIT_INSN(),
  34. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, offsetof(struct bpf_sock, type)),
  35. BPF_MOV64_IMM(BPF_REG_0, 0),
  36. BPF_EXIT_INSN(),
  37. },
  38. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  39. .result = REJECT,
  40. .errstr = "invalid sock_common access",
  41. },
  42. {
  43. "bpf_sk_fullsock(skb->sk): no !skb->sk check",
  44. .insns = {
  45. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  46. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  47. BPF_MOV64_IMM(BPF_REG_0, 0),
  48. BPF_EXIT_INSN(),
  49. },
  50. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  51. .result = REJECT,
  52. .errstr = "type=sock_common_or_null expected=sock_common",
  53. },
  54. {
  55. "sk_fullsock(skb->sk): no NULL check on ret",
  56. .insns = {
  57. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  58. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  59. BPF_MOV64_IMM(BPF_REG_0, 0),
  60. BPF_EXIT_INSN(),
  61. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  62. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
  63. BPF_MOV64_IMM(BPF_REG_0, 0),
  64. BPF_EXIT_INSN(),
  65. },
  66. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  67. .result = REJECT,
  68. .errstr = "invalid mem access 'sock_or_null'",
  69. },
  70. {
  71. "sk_fullsock(skb->sk): sk->type [fullsock field]",
  72. .insns = {
  73. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  74. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  75. BPF_MOV64_IMM(BPF_REG_0, 0),
  76. BPF_EXIT_INSN(),
  77. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  78. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  79. BPF_MOV64_IMM(BPF_REG_0, 0),
  80. BPF_EXIT_INSN(),
  81. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
  82. BPF_MOV64_IMM(BPF_REG_0, 0),
  83. BPF_EXIT_INSN(),
  84. },
  85. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  86. .result = ACCEPT,
  87. },
  88. {
  89. "sk_fullsock(skb->sk): sk->family [non fullsock field]",
  90. .insns = {
  91. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  92. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  93. BPF_MOV64_IMM(BPF_REG_0, 0),
  94. BPF_EXIT_INSN(),
  95. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  96. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  97. BPF_EXIT_INSN(),
  98. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, family)),
  99. BPF_MOV64_IMM(BPF_REG_0, 0),
  100. BPF_EXIT_INSN(),
  101. },
  102. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  103. .result = ACCEPT,
  104. },
  105. {
  106. "sk_fullsock(skb->sk): sk->state [narrow load]",
  107. .insns = {
  108. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  109. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  110. BPF_MOV64_IMM(BPF_REG_0, 0),
  111. BPF_EXIT_INSN(),
  112. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  113. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  114. BPF_MOV64_IMM(BPF_REG_0, 0),
  115. BPF_EXIT_INSN(),
  116. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, state)),
  117. BPF_MOV64_IMM(BPF_REG_0, 0),
  118. BPF_EXIT_INSN(),
  119. },
  120. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  121. .result = ACCEPT,
  122. },
  123. {
  124. "sk_fullsock(skb->sk): sk->dst_port [word load] (backward compatibility)",
  125. .insns = {
  126. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  127. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  128. BPF_MOV64_IMM(BPF_REG_0, 0),
  129. BPF_EXIT_INSN(),
  130. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  131. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  132. BPF_MOV64_IMM(BPF_REG_0, 0),
  133. BPF_EXIT_INSN(),
  134. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
  135. BPF_MOV64_IMM(BPF_REG_0, 0),
  136. BPF_EXIT_INSN(),
  137. },
  138. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  139. .result = ACCEPT,
  140. },
  141. {
  142. "sk_fullsock(skb->sk): sk->dst_port [half load]",
  143. .insns = {
  144. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  145. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  146. BPF_MOV64_IMM(BPF_REG_0, 0),
  147. BPF_EXIT_INSN(),
  148. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  149. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  150. BPF_MOV64_IMM(BPF_REG_0, 0),
  151. BPF_EXIT_INSN(),
  152. BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
  153. BPF_MOV64_IMM(BPF_REG_0, 0),
  154. BPF_EXIT_INSN(),
  155. },
  156. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  157. .result = ACCEPT,
  158. },
  159. {
  160. "sk_fullsock(skb->sk): sk->dst_port [half load] (invalid)",
  161. .insns = {
  162. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  163. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  164. BPF_MOV64_IMM(BPF_REG_0, 0),
  165. BPF_EXIT_INSN(),
  166. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  167. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  168. BPF_MOV64_IMM(BPF_REG_0, 0),
  169. BPF_EXIT_INSN(),
  170. BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 2),
  171. BPF_MOV64_IMM(BPF_REG_0, 0),
  172. BPF_EXIT_INSN(),
  173. },
  174. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  175. .result = REJECT,
  176. .errstr = "invalid sock access",
  177. },
  178. {
  179. "sk_fullsock(skb->sk): sk->dst_port [byte load]",
  180. .insns = {
  181. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  182. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  183. BPF_MOV64_IMM(BPF_REG_0, 0),
  184. BPF_EXIT_INSN(),
  185. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  186. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  187. BPF_MOV64_IMM(BPF_REG_0, 0),
  188. BPF_EXIT_INSN(),
  189. BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
  190. BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 1),
  191. BPF_MOV64_IMM(BPF_REG_0, 0),
  192. BPF_EXIT_INSN(),
  193. },
  194. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  195. .result = ACCEPT,
  196. },
  197. {
  198. "sk_fullsock(skb->sk): sk->dst_port [byte load] (invalid)",
  199. .insns = {
  200. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  201. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  202. BPF_MOV64_IMM(BPF_REG_0, 0),
  203. BPF_EXIT_INSN(),
  204. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  205. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  206. BPF_MOV64_IMM(BPF_REG_0, 0),
  207. BPF_EXIT_INSN(),
  208. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 2),
  209. BPF_MOV64_IMM(BPF_REG_0, 0),
  210. BPF_EXIT_INSN(),
  211. },
  212. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  213. .result = REJECT,
  214. .errstr = "invalid sock access",
  215. },
  216. {
  217. "sk_fullsock(skb->sk): past sk->dst_port [half load] (invalid)",
  218. .insns = {
  219. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  220. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  221. BPF_MOV64_IMM(BPF_REG_0, 0),
  222. BPF_EXIT_INSN(),
  223. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  224. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  225. BPF_MOV64_IMM(BPF_REG_0, 0),
  226. BPF_EXIT_INSN(),
  227. BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_sock, dst_port)),
  228. BPF_MOV64_IMM(BPF_REG_0, 0),
  229. BPF_EXIT_INSN(),
  230. },
  231. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  232. .result = REJECT,
  233. .errstr = "invalid sock access",
  234. },
  235. {
  236. "sk_fullsock(skb->sk): sk->dst_ip6 [load 2nd byte]",
  237. .insns = {
  238. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  239. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  240. BPF_MOV64_IMM(BPF_REG_0, 0),
  241. BPF_EXIT_INSN(),
  242. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  243. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  244. BPF_MOV64_IMM(BPF_REG_0, 0),
  245. BPF_EXIT_INSN(),
  246. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_ip6[0]) + 1),
  247. BPF_MOV64_IMM(BPF_REG_0, 0),
  248. BPF_EXIT_INSN(),
  249. },
  250. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  251. .result = ACCEPT,
  252. },
  253. {
  254. "sk_fullsock(skb->sk): sk->type [narrow load]",
  255. .insns = {
  256. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  257. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  258. BPF_MOV64_IMM(BPF_REG_0, 0),
  259. BPF_EXIT_INSN(),
  260. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  261. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  262. BPF_MOV64_IMM(BPF_REG_0, 0),
  263. BPF_EXIT_INSN(),
  264. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
  265. BPF_MOV64_IMM(BPF_REG_0, 0),
  266. BPF_EXIT_INSN(),
  267. },
  268. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  269. .result = ACCEPT,
  270. },
  271. {
  272. "sk_fullsock(skb->sk): sk->protocol [narrow load]",
  273. .insns = {
  274. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  275. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  276. BPF_MOV64_IMM(BPF_REG_0, 0),
  277. BPF_EXIT_INSN(),
  278. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  279. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  280. BPF_MOV64_IMM(BPF_REG_0, 0),
  281. BPF_EXIT_INSN(),
  282. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, protocol)),
  283. BPF_MOV64_IMM(BPF_REG_0, 0),
  284. BPF_EXIT_INSN(),
  285. },
  286. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  287. .result = ACCEPT,
  288. },
  289. {
  290. "sk_fullsock(skb->sk): beyond last field",
  291. .insns = {
  292. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  293. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  294. BPF_MOV64_IMM(BPF_REG_0, 0),
  295. BPF_EXIT_INSN(),
  296. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  297. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  298. BPF_MOV64_IMM(BPF_REG_0, 0),
  299. BPF_EXIT_INSN(),
  300. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_sock, rx_queue_mapping)),
  301. BPF_MOV64_IMM(BPF_REG_0, 0),
  302. BPF_EXIT_INSN(),
  303. },
  304. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  305. .result = REJECT,
  306. .errstr = "invalid sock access",
  307. },
  308. {
  309. "bpf_tcp_sock(skb->sk): no !skb->sk check",
  310. .insns = {
  311. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  312. BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
  313. BPF_MOV64_IMM(BPF_REG_0, 0),
  314. BPF_EXIT_INSN(),
  315. },
  316. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  317. .result = REJECT,
  318. .errstr = "type=sock_common_or_null expected=sock_common",
  319. },
  320. {
  321. "bpf_tcp_sock(skb->sk): no NULL check on ret",
  322. .insns = {
  323. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  324. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  325. BPF_MOV64_IMM(BPF_REG_0, 0),
  326. BPF_EXIT_INSN(),
  327. BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
  328. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
  329. BPF_MOV64_IMM(BPF_REG_0, 0),
  330. BPF_EXIT_INSN(),
  331. },
  332. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  333. .result = REJECT,
  334. .errstr = "invalid mem access 'tcp_sock_or_null'",
  335. },
  336. {
  337. "bpf_tcp_sock(skb->sk): tp->snd_cwnd",
  338. .insns = {
  339. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  340. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  341. BPF_MOV64_IMM(BPF_REG_0, 0),
  342. BPF_EXIT_INSN(),
  343. BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
  344. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  345. BPF_EXIT_INSN(),
  346. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
  347. BPF_MOV64_IMM(BPF_REG_0, 0),
  348. BPF_EXIT_INSN(),
  349. },
  350. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  351. .result = ACCEPT,
  352. },
  353. {
  354. "bpf_tcp_sock(skb->sk): tp->bytes_acked",
  355. .insns = {
  356. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  357. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  358. BPF_MOV64_IMM(BPF_REG_0, 0),
  359. BPF_EXIT_INSN(),
  360. BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
  361. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  362. BPF_EXIT_INSN(),
  363. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, bytes_acked)),
  364. BPF_MOV64_IMM(BPF_REG_0, 0),
  365. BPF_EXIT_INSN(),
  366. },
  367. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  368. .result = ACCEPT,
  369. },
  370. {
  371. "bpf_tcp_sock(skb->sk): beyond last field",
  372. .insns = {
  373. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  374. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  375. BPF_MOV64_IMM(BPF_REG_0, 0),
  376. BPF_EXIT_INSN(),
  377. BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
  378. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  379. BPF_EXIT_INSN(),
  380. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_tcp_sock, bytes_acked)),
  381. BPF_MOV64_IMM(BPF_REG_0, 0),
  382. BPF_EXIT_INSN(),
  383. },
  384. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  385. .result = REJECT,
  386. .errstr = "invalid tcp_sock access",
  387. },
  388. {
  389. "bpf_tcp_sock(bpf_sk_fullsock(skb->sk)): tp->snd_cwnd",
  390. .insns = {
  391. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  392. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  393. BPF_MOV64_IMM(BPF_REG_0, 0),
  394. BPF_EXIT_INSN(),
  395. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  396. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  397. BPF_EXIT_INSN(),
  398. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  399. BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
  400. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  401. BPF_EXIT_INSN(),
  402. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
  403. BPF_MOV64_IMM(BPF_REG_0, 0),
  404. BPF_EXIT_INSN(),
  405. },
  406. .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  407. .result = ACCEPT,
  408. },
  409. {
  410. "bpf_sk_release(skb->sk)",
  411. .insns = {
  412. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  413. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
  414. BPF_EMIT_CALL(BPF_FUNC_sk_release),
  415. BPF_MOV64_IMM(BPF_REG_0, 0),
  416. BPF_EXIT_INSN(),
  417. },
  418. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  419. .result = REJECT,
  420. .errstr = "R1 must be referenced when passed to release function",
  421. },
  422. {
  423. "bpf_sk_release(bpf_sk_fullsock(skb->sk))",
  424. .insns = {
  425. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  426. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  427. BPF_MOV64_IMM(BPF_REG_0, 0),
  428. BPF_EXIT_INSN(),
  429. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  430. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  431. BPF_EXIT_INSN(),
  432. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  433. BPF_EMIT_CALL(BPF_FUNC_sk_release),
  434. BPF_MOV64_IMM(BPF_REG_0, 1),
  435. BPF_EXIT_INSN(),
  436. },
  437. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  438. .result = REJECT,
  439. .errstr = "R1 must be referenced when passed to release function",
  440. },
  441. {
  442. "bpf_sk_release(bpf_tcp_sock(skb->sk))",
  443. .insns = {
  444. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  445. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  446. BPF_MOV64_IMM(BPF_REG_0, 0),
  447. BPF_EXIT_INSN(),
  448. BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
  449. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  450. BPF_EXIT_INSN(),
  451. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  452. BPF_EMIT_CALL(BPF_FUNC_sk_release),
  453. BPF_MOV64_IMM(BPF_REG_0, 1),
  454. BPF_EXIT_INSN(),
  455. },
  456. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  457. .result = REJECT,
  458. .errstr = "R1 must be referenced when passed to release function",
  459. },
  460. {
  461. "sk_storage_get(map, skb->sk, NULL, 0): value == NULL",
  462. .insns = {
  463. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  464. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  465. BPF_MOV64_IMM(BPF_REG_0, 0),
  466. BPF_EXIT_INSN(),
  467. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  468. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  469. BPF_MOV64_IMM(BPF_REG_0, 0),
  470. BPF_EXIT_INSN(),
  471. BPF_MOV64_IMM(BPF_REG_4, 0),
  472. BPF_MOV64_IMM(BPF_REG_3, 0),
  473. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  474. BPF_LD_MAP_FD(BPF_REG_1, 0),
  475. BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
  476. BPF_MOV64_IMM(BPF_REG_0, 0),
  477. BPF_EXIT_INSN(),
  478. },
  479. .fixup_sk_storage_map = { 11 },
  480. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  481. .result = ACCEPT,
  482. },
  483. {
  484. "sk_storage_get(map, skb->sk, 1, 1): value == 1",
  485. .insns = {
  486. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  487. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  488. BPF_MOV64_IMM(BPF_REG_0, 0),
  489. BPF_EXIT_INSN(),
  490. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  491. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  492. BPF_MOV64_IMM(BPF_REG_0, 0),
  493. BPF_EXIT_INSN(),
  494. BPF_MOV64_IMM(BPF_REG_4, 1),
  495. BPF_MOV64_IMM(BPF_REG_3, 1),
  496. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  497. BPF_LD_MAP_FD(BPF_REG_1, 0),
  498. BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
  499. BPF_MOV64_IMM(BPF_REG_0, 0),
  500. BPF_EXIT_INSN(),
  501. },
  502. .fixup_sk_storage_map = { 11 },
  503. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  504. .result = REJECT,
  505. .errstr = "R3 type=scalar expected=fp",
  506. },
  507. {
  508. "sk_storage_get(map, skb->sk, &stack_value, 1): stack_value",
  509. .insns = {
  510. BPF_MOV64_IMM(BPF_REG_2, 0),
  511. BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8),
  512. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  513. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  514. BPF_MOV64_IMM(BPF_REG_0, 0),
  515. BPF_EXIT_INSN(),
  516. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  517. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  518. BPF_MOV64_IMM(BPF_REG_0, 0),
  519. BPF_EXIT_INSN(),
  520. BPF_MOV64_IMM(BPF_REG_4, 1),
  521. BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
  522. BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -8),
  523. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  524. BPF_LD_MAP_FD(BPF_REG_1, 0),
  525. BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
  526. BPF_MOV64_IMM(BPF_REG_0, 0),
  527. BPF_EXIT_INSN(),
  528. },
  529. .fixup_sk_storage_map = { 14 },
  530. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  531. .result = ACCEPT,
  532. },
  533. {
  534. "sk_storage_get(map, skb->sk, &stack_value, 1): partially init stack_value",
  535. .insns = {
  536. BPF_MOV64_IMM(BPF_REG_2, 0),
  537. BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8),
  538. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  539. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  540. BPF_MOV64_IMM(BPF_REG_0, 0),
  541. BPF_EXIT_INSN(),
  542. BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
  543. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
  544. BPF_MOV64_IMM(BPF_REG_0, 0),
  545. BPF_EXIT_INSN(),
  546. BPF_MOV64_IMM(BPF_REG_4, 1),
  547. BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
  548. BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -8),
  549. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  550. BPF_LD_MAP_FD(BPF_REG_1, 0),
  551. BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
  552. BPF_MOV64_IMM(BPF_REG_0, 0),
  553. BPF_EXIT_INSN(),
  554. },
  555. .fixup_sk_storage_map = { 14 },
  556. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  557. .result = REJECT,
  558. .errstr = "invalid indirect read from stack",
  559. },
  560. {
  561. "bpf_map_lookup_elem(smap, &key)",
  562. .insns = {
  563. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  564. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  565. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  566. BPF_LD_MAP_FD(BPF_REG_1, 0),
  567. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  568. BPF_MOV64_IMM(BPF_REG_0, 0),
  569. BPF_EXIT_INSN(),
  570. },
  571. .fixup_sk_storage_map = { 3 },
  572. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  573. .result = REJECT,
  574. .errstr = "cannot pass map_type 24 into func bpf_map_lookup_elem",
  575. },
  576. {
  577. "bpf_map_lookup_elem(xskmap, &key); xs->queue_id",
  578. .insns = {
  579. BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0),
  580. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  581. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  582. BPF_LD_MAP_FD(BPF_REG_1, 0),
  583. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  584. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  585. BPF_EXIT_INSN(),
  586. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_xdp_sock, queue_id)),
  587. BPF_MOV64_IMM(BPF_REG_0, 0),
  588. BPF_EXIT_INSN(),
  589. },
  590. .fixup_map_xskmap = { 3 },
  591. .prog_type = BPF_PROG_TYPE_XDP,
  592. .result = ACCEPT,
  593. },
  594. {
  595. "bpf_map_lookup_elem(sockmap, &key)",
  596. .insns = {
  597. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  598. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  599. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  600. BPF_LD_MAP_FD(BPF_REG_1, 0),
  601. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  602. BPF_MOV64_IMM(BPF_REG_0, 0),
  603. BPF_EXIT_INSN(),
  604. },
  605. .fixup_map_sockmap = { 3 },
  606. .prog_type = BPF_PROG_TYPE_SK_SKB,
  607. .result = REJECT,
  608. .errstr = "Unreleased reference id=2 alloc_insn=5",
  609. },
  610. {
  611. "bpf_map_lookup_elem(sockhash, &key)",
  612. .insns = {
  613. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  614. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  615. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  616. BPF_LD_MAP_FD(BPF_REG_1, 0),
  617. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  618. BPF_MOV64_IMM(BPF_REG_0, 0),
  619. BPF_EXIT_INSN(),
  620. },
  621. .fixup_map_sockhash = { 3 },
  622. .prog_type = BPF_PROG_TYPE_SK_SKB,
  623. .result = REJECT,
  624. .errstr = "Unreleased reference id=2 alloc_insn=5",
  625. },
  626. {
  627. "bpf_map_lookup_elem(sockmap, &key); sk->type [fullsock field]; bpf_sk_release(sk)",
  628. .insns = {
  629. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  630. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  631. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  632. BPF_LD_MAP_FD(BPF_REG_1, 0),
  633. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  634. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  635. BPF_EXIT_INSN(),
  636. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  637. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
  638. BPF_EMIT_CALL(BPF_FUNC_sk_release),
  639. BPF_EXIT_INSN(),
  640. },
  641. .fixup_map_sockmap = { 3 },
  642. .prog_type = BPF_PROG_TYPE_SK_SKB,
  643. .result = ACCEPT,
  644. },
  645. {
  646. "bpf_map_lookup_elem(sockhash, &key); sk->type [fullsock field]; bpf_sk_release(sk)",
  647. .insns = {
  648. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  649. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  650. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  651. BPF_LD_MAP_FD(BPF_REG_1, 0),
  652. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  653. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  654. BPF_EXIT_INSN(),
  655. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  656. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
  657. BPF_EMIT_CALL(BPF_FUNC_sk_release),
  658. BPF_EXIT_INSN(),
  659. },
  660. .fixup_map_sockhash = { 3 },
  661. .prog_type = BPF_PROG_TYPE_SK_SKB,
  662. .result = ACCEPT,
  663. },
  664. {
  665. "bpf_sk_select_reuseport(ctx, reuseport_array, &key, flags)",
  666. .insns = {
  667. BPF_MOV64_IMM(BPF_REG_4, 0),
  668. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  669. BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
  670. BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
  671. BPF_LD_MAP_FD(BPF_REG_2, 0),
  672. BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
  673. BPF_EXIT_INSN(),
  674. },
  675. .fixup_map_reuseport_array = { 4 },
  676. .prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
  677. .result = ACCEPT,
  678. },
  679. {
  680. "bpf_sk_select_reuseport(ctx, sockmap, &key, flags)",
  681. .insns = {
  682. BPF_MOV64_IMM(BPF_REG_4, 0),
  683. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  684. BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
  685. BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
  686. BPF_LD_MAP_FD(BPF_REG_2, 0),
  687. BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
  688. BPF_EXIT_INSN(),
  689. },
  690. .fixup_map_sockmap = { 4 },
  691. .prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
  692. .result = ACCEPT,
  693. },
  694. {
  695. "bpf_sk_select_reuseport(ctx, sockhash, &key, flags)",
  696. .insns = {
  697. BPF_MOV64_IMM(BPF_REG_4, 0),
  698. BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  699. BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
  700. BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
  701. BPF_LD_MAP_FD(BPF_REG_2, 0),
  702. BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
  703. BPF_EXIT_INSN(),
  704. },
  705. .fixup_map_sockmap = { 4 },
  706. .prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
  707. .result = ACCEPT,
  708. },
  709. {
  710. "mark null check on return value of bpf_skc_to helpers",
  711. .insns = {
  712. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
  713. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
  714. BPF_MOV64_IMM(BPF_REG_0, 0),
  715. BPF_EXIT_INSN(),
  716. BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
  717. BPF_EMIT_CALL(BPF_FUNC_skc_to_tcp_sock),
  718. BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
  719. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  720. BPF_EMIT_CALL(BPF_FUNC_skc_to_tcp_request_sock),
  721. BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
  722. BPF_JMP_IMM(BPF_JNE, BPF_REG_8, 0, 2),
  723. BPF_MOV64_IMM(BPF_REG_0, 0),
  724. BPF_EXIT_INSN(),
  725. BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_7, 0),
  726. BPF_EXIT_INSN(),
  727. },
  728. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  729. .result = REJECT,
  730. .errstr = "invalid mem access",
  731. .result_unpriv = REJECT,
  732. .errstr_unpriv = "unknown func",
  733. },