diff options
Diffstat (limited to 'kernel/bpf')
| -rw-r--r-- | kernel/bpf/hashtab.c | 2 | ||||
| -rw-r--r-- | kernel/bpf/verifier.c | 283 |
2 files changed, 168 insertions, 117 deletions
diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c index e469e05c8e83..3905d4bc5b80 100644 --- a/kernel/bpf/hashtab.c +++ b/kernel/bpf/hashtab.c | |||
| @@ -114,6 +114,7 @@ static void htab_free_elems(struct bpf_htab *htab) | |||
| 114 | pptr = htab_elem_get_ptr(get_htab_elem(htab, i), | 114 | pptr = htab_elem_get_ptr(get_htab_elem(htab, i), |
| 115 | htab->map.key_size); | 115 | htab->map.key_size); |
| 116 | free_percpu(pptr); | 116 | free_percpu(pptr); |
| 117 | cond_resched(); | ||
| 117 | } | 118 | } |
| 118 | free_elems: | 119 | free_elems: |
| 119 | bpf_map_area_free(htab->elems); | 120 | bpf_map_area_free(htab->elems); |
| @@ -159,6 +160,7 @@ static int prealloc_init(struct bpf_htab *htab) | |||
| 159 | goto free_elems; | 160 | goto free_elems; |
| 160 | htab_elem_set_ptr(get_htab_elem(htab, i), htab->map.key_size, | 161 | htab_elem_set_ptr(get_htab_elem(htab, i), htab->map.key_size, |
| 161 | pptr); | 162 | pptr); |
| 163 | cond_resched(); | ||
| 162 | } | 164 | } |
| 163 | 165 | ||
| 164 | skip_percpu_elems: | 166 | skip_percpu_elems: |
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index d4593571c404..04b24876cd23 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
| @@ -1059,6 +1059,11 @@ static int check_ptr_alignment(struct bpf_verifier_env *env, | |||
| 1059 | break; | 1059 | break; |
| 1060 | case PTR_TO_STACK: | 1060 | case PTR_TO_STACK: |
| 1061 | pointer_desc = "stack "; | 1061 | pointer_desc = "stack "; |
| 1062 | /* The stack spill tracking logic in check_stack_write() | ||
| 1063 | * and check_stack_read() relies on stack accesses being | ||
| 1064 | * aligned. | ||
| 1065 | */ | ||
| 1066 | strict = true; | ||
| 1062 | break; | 1067 | break; |
| 1063 | default: | 1068 | default: |
| 1064 | break; | 1069 | break; |
| @@ -1067,6 +1072,29 @@ static int check_ptr_alignment(struct bpf_verifier_env *env, | |||
| 1067 | strict); | 1072 | strict); |
| 1068 | } | 1073 | } |
| 1069 | 1074 | ||
| 1075 | /* truncate register to smaller size (in bytes) | ||
| 1076 | * must be called with size < BPF_REG_SIZE | ||
| 1077 | */ | ||
| 1078 | static void coerce_reg_to_size(struct bpf_reg_state *reg, int size) | ||
| 1079 | { | ||
| 1080 | u64 mask; | ||
| 1081 | |||
| 1082 | /* clear high bits in bit representation */ | ||
| 1083 | reg->var_off = tnum_cast(reg->var_off, size); | ||
| 1084 | |||
| 1085 | /* fix arithmetic bounds */ | ||
| 1086 | mask = ((u64)1 << (size * 8)) - 1; | ||
| 1087 | if ((reg->umin_value & ~mask) == (reg->umax_value & ~mask)) { | ||
| 1088 | reg->umin_value &= mask; | ||
| 1089 | reg->umax_value &= mask; | ||
| 1090 | } else { | ||
| 1091 | reg->umin_value = 0; | ||
| 1092 | reg->umax_value = mask; | ||
| 1093 | } | ||
| 1094 | reg->smin_value = reg->umin_value; | ||
| 1095 | reg->smax_value = reg->umax_value; | ||
| 1096 | } | ||
| 1097 | |||
| 1070 | /* check whether memory at (regno + off) is accessible for t = (read | write) | 1098 | /* check whether memory at (regno + off) is accessible for t = (read | write) |
| 1071 | * if t==write, value_regno is a register which value is stored into memory | 1099 | * if t==write, value_regno is a register which value is stored into memory |
| 1072 | * if t==read, value_regno is a register which will receive the value from memory | 1100 | * if t==read, value_regno is a register which will receive the value from memory |
| @@ -1200,9 +1228,7 @@ static int check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regn | |||
| 1200 | if (!err && size < BPF_REG_SIZE && value_regno >= 0 && t == BPF_READ && | 1228 | if (!err && size < BPF_REG_SIZE && value_regno >= 0 && t == BPF_READ && |
| 1201 | regs[value_regno].type == SCALAR_VALUE) { | 1229 | regs[value_regno].type == SCALAR_VALUE) { |
| 1202 | /* b/h/w load zero-extends, mark upper bits as known 0 */ | 1230 | /* b/h/w load zero-extends, mark upper bits as known 0 */ |
| 1203 | regs[value_regno].var_off = | 1231 | coerce_reg_to_size(®s[value_regno], size); |
| 1204 | tnum_cast(regs[value_regno].var_off, size); | ||
| 1205 | __update_reg_bounds(®s[value_regno]); | ||
| 1206 | } | 1232 | } |
| 1207 | return err; | 1233 | return err; |
| 1208 | } | 1234 | } |
| @@ -1282,6 +1308,7 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno, | |||
| 1282 | tnum_strn(tn_buf, sizeof(tn_buf), regs[regno].var_off); | 1308 | tnum_strn(tn_buf, sizeof(tn_buf), regs[regno].var_off); |
| 1283 | verbose(env, "invalid variable stack read R%d var_off=%s\n", | 1309 | verbose(env, "invalid variable stack read R%d var_off=%s\n", |
| 1284 | regno, tn_buf); | 1310 | regno, tn_buf); |
| 1311 | return -EACCES; | ||
| 1285 | } | 1312 | } |
| 1286 | off = regs[regno].off + regs[regno].var_off.value; | 1313 | off = regs[regno].off + regs[regno].var_off.value; |
| 1287 | if (off >= 0 || off < -MAX_BPF_STACK || off + access_size > 0 || | 1314 | if (off >= 0 || off < -MAX_BPF_STACK || off + access_size > 0 || |
| @@ -1674,7 +1701,13 @@ static int check_call(struct bpf_verifier_env *env, int func_id, int insn_idx) | |||
| 1674 | return -EINVAL; | 1701 | return -EINVAL; |
| 1675 | } | 1702 | } |
| 1676 | 1703 | ||
| 1704 | /* With LD_ABS/IND some JITs save/restore skb from r1. */ | ||
| 1677 | changes_data = bpf_helper_changes_pkt_data(fn->func); | 1705 | changes_data = bpf_helper_changes_pkt_data(fn->func); |
| 1706 | if (changes_data && fn->arg1_type != ARG_PTR_TO_CTX) { | ||
| 1707 | verbose(env, "kernel subsystem misconfigured func %s#%d: r1 != ctx\n", | ||
| 1708 | func_id_name(func_id), func_id); | ||
| 1709 | return -EINVAL; | ||
| 1710 | } | ||
| 1678 | 1711 | ||
| 1679 | memset(&meta, 0, sizeof(meta)); | 1712 | memset(&meta, 0, sizeof(meta)); |
| 1680 | meta.pkt_access = fn->pkt_access; | 1713 | meta.pkt_access = fn->pkt_access; |
| @@ -1766,14 +1799,6 @@ static int check_call(struct bpf_verifier_env *env, int func_id, int insn_idx) | |||
| 1766 | return 0; | 1799 | return 0; |
| 1767 | } | 1800 | } |
| 1768 | 1801 | ||
| 1769 | static void coerce_reg_to_32(struct bpf_reg_state *reg) | ||
| 1770 | { | ||
| 1771 | /* clear high 32 bits */ | ||
| 1772 | reg->var_off = tnum_cast(reg->var_off, 4); | ||
| 1773 | /* Update bounds */ | ||
| 1774 | __update_reg_bounds(reg); | ||
| 1775 | } | ||
| 1776 | |||
| 1777 | static bool signed_add_overflows(s64 a, s64 b) | 1802 | static bool signed_add_overflows(s64 a, s64 b) |
| 1778 | { | 1803 | { |
| 1779 | /* Do the add in u64, where overflow is well-defined */ | 1804 | /* Do the add in u64, where overflow is well-defined */ |
| @@ -1794,6 +1819,41 @@ static bool signed_sub_overflows(s64 a, s64 b) | |||
| 1794 | return res > a; | 1819 | return res > a; |
| 1795 | } | 1820 | } |
| 1796 | 1821 | ||
| 1822 | static bool check_reg_sane_offset(struct bpf_verifier_env *env, | ||
| 1823 | const struct bpf_reg_state *reg, | ||
| 1824 | enum bpf_reg_type type) | ||
| 1825 | { | ||
| 1826 | bool known = tnum_is_const(reg->var_off); | ||
| 1827 | s64 val = reg->var_off.value; | ||
| 1828 | s64 smin = reg->smin_value; | ||
| 1829 | |||
| 1830 | if (known && (val >= BPF_MAX_VAR_OFF || val <= -BPF_MAX_VAR_OFF)) { | ||
| 1831 | verbose(env, "math between %s pointer and %lld is not allowed\n", | ||
| 1832 | reg_type_str[type], val); | ||
| 1833 | return false; | ||
| 1834 | } | ||
| 1835 | |||
| 1836 | if (reg->off >= BPF_MAX_VAR_OFF || reg->off <= -BPF_MAX_VAR_OFF) { | ||
| 1837 | verbose(env, "%s pointer offset %d is not allowed\n", | ||
| 1838 | reg_type_str[type], reg->off); | ||
| 1839 | return false; | ||
| 1840 | } | ||
| 1841 | |||
| 1842 | if (smin == S64_MIN) { | ||
| 1843 | verbose(env, "math between %s pointer and register with unbounded min value is not allowed\n", | ||
| 1844 | reg_type_str[type]); | ||
| 1845 | return false; | ||
| 1846 | } | ||
| 1847 | |||
| 1848 | if (smin >= BPF_MAX_VAR_OFF || smin <= -BPF_MAX_VAR_OFF) { | ||
| 1849 | verbose(env, "value %lld makes %s pointer be out of bounds\n", | ||
| 1850 | smin, reg_type_str[type]); | ||
| 1851 | return false; | ||
| 1852 | } | ||
| 1853 | |||
| 1854 | return true; | ||
| 1855 | } | ||
| 1856 | |||
| 1797 | /* Handles arithmetic on a pointer and a scalar: computes new min/max and var_off. | 1857 | /* Handles arithmetic on a pointer and a scalar: computes new min/max and var_off. |
| 1798 | * Caller should also handle BPF_MOV case separately. | 1858 | * Caller should also handle BPF_MOV case separately. |
| 1799 | * If we return -EACCES, caller may want to try again treating pointer as a | 1859 | * If we return -EACCES, caller may want to try again treating pointer as a |
| @@ -1830,29 +1890,25 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env, | |||
| 1830 | 1890 | ||
| 1831 | if (BPF_CLASS(insn->code) != BPF_ALU64) { | 1891 | if (BPF_CLASS(insn->code) != BPF_ALU64) { |
| 1832 | /* 32-bit ALU ops on pointers produce (meaningless) scalars */ | 1892 | /* 32-bit ALU ops on pointers produce (meaningless) scalars */ |
| 1833 | if (!env->allow_ptr_leaks) | 1893 | verbose(env, |
| 1834 | verbose(env, | 1894 | "R%d 32-bit pointer arithmetic prohibited\n", |
| 1835 | "R%d 32-bit pointer arithmetic prohibited\n", | 1895 | dst); |
| 1836 | dst); | ||
| 1837 | return -EACCES; | 1896 | return -EACCES; |
| 1838 | } | 1897 | } |
| 1839 | 1898 | ||
| 1840 | if (ptr_reg->type == PTR_TO_MAP_VALUE_OR_NULL) { | 1899 | if (ptr_reg->type == PTR_TO_MAP_VALUE_OR_NULL) { |
| 1841 | if (!env->allow_ptr_leaks) | 1900 | verbose(env, "R%d pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL prohibited, null-check it first\n", |
| 1842 | verbose(env, "R%d pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL prohibited, null-check it first\n", | 1901 | dst); |
| 1843 | dst); | ||
| 1844 | return -EACCES; | 1902 | return -EACCES; |
| 1845 | } | 1903 | } |
| 1846 | if (ptr_reg->type == CONST_PTR_TO_MAP) { | 1904 | if (ptr_reg->type == CONST_PTR_TO_MAP) { |
| 1847 | if (!env->allow_ptr_leaks) | 1905 | verbose(env, "R%d pointer arithmetic on CONST_PTR_TO_MAP prohibited\n", |
| 1848 | verbose(env, "R%d pointer arithmetic on CONST_PTR_TO_MAP prohibited\n", | 1906 | dst); |
| 1849 | dst); | ||
| 1850 | return -EACCES; | 1907 | return -EACCES; |
| 1851 | } | 1908 | } |
| 1852 | if (ptr_reg->type == PTR_TO_PACKET_END) { | 1909 | if (ptr_reg->type == PTR_TO_PACKET_END) { |
| 1853 | if (!env->allow_ptr_leaks) | 1910 | verbose(env, "R%d pointer arithmetic on PTR_TO_PACKET_END prohibited\n", |
| 1854 | verbose(env, "R%d pointer arithmetic on PTR_TO_PACKET_END prohibited\n", | 1911 | dst); |
| 1855 | dst); | ||
| 1856 | return -EACCES; | 1912 | return -EACCES; |
| 1857 | } | 1913 | } |
| 1858 | 1914 | ||
| @@ -1862,6 +1918,10 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env, | |||
| 1862 | dst_reg->type = ptr_reg->type; | 1918 | dst_reg->type = ptr_reg->type; |
| 1863 | dst_reg->id = ptr_reg->id; | 1919 | dst_reg->id = ptr_reg->id; |
| 1864 | 1920 | ||
| 1921 | if (!check_reg_sane_offset(env, off_reg, ptr_reg->type) || | ||
| 1922 | !check_reg_sane_offset(env, ptr_reg, ptr_reg->type)) | ||
| 1923 | return -EINVAL; | ||
| 1924 | |||
| 1865 | switch (opcode) { | 1925 | switch (opcode) { |
| 1866 | case BPF_ADD: | 1926 | case BPF_ADD: |
| 1867 | /* We can take a fixed offset as long as it doesn't overflow | 1927 | /* We can take a fixed offset as long as it doesn't overflow |
| @@ -1915,9 +1975,8 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env, | |||
| 1915 | case BPF_SUB: | 1975 | case BPF_SUB: |
| 1916 | if (dst_reg == off_reg) { | 1976 | if (dst_reg == off_reg) { |
| 1917 | /* scalar -= pointer. Creates an unknown scalar */ | 1977 | /* scalar -= pointer. Creates an unknown scalar */ |
| 1918 | if (!env->allow_ptr_leaks) | 1978 | verbose(env, "R%d tried to subtract pointer from scalar\n", |
| 1919 | verbose(env, "R%d tried to subtract pointer from scalar\n", | 1979 | dst); |
| 1920 | dst); | ||
| 1921 | return -EACCES; | 1980 | return -EACCES; |
| 1922 | } | 1981 | } |
| 1923 | /* We don't allow subtraction from FP, because (according to | 1982 | /* We don't allow subtraction from FP, because (according to |
| @@ -1925,9 +1984,8 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env, | |||
| 1925 | * be able to deal with it. | 1984 | * be able to deal with it. |
| 1926 | */ | 1985 | */ |
| 1927 | if (ptr_reg->type == PTR_TO_STACK) { | 1986 | if (ptr_reg->type == PTR_TO_STACK) { |
| 1928 | if (!env->allow_ptr_leaks) | 1987 | verbose(env, "R%d subtraction from stack pointer prohibited\n", |
| 1929 | verbose(env, "R%d subtraction from stack pointer prohibited\n", | 1988 | dst); |
| 1930 | dst); | ||
| 1931 | return -EACCES; | 1989 | return -EACCES; |
| 1932 | } | 1990 | } |
| 1933 | if (known && (ptr_reg->off - smin_val == | 1991 | if (known && (ptr_reg->off - smin_val == |
| @@ -1976,28 +2034,30 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env, | |||
| 1976 | case BPF_AND: | 2034 | case BPF_AND: |
| 1977 | case BPF_OR: | 2035 | case BPF_OR: |
| 1978 | case BPF_XOR: | 2036 | case BPF_XOR: |
| 1979 | /* bitwise ops on pointers are troublesome, prohibit for now. | 2037 | /* bitwise ops on pointers are troublesome, prohibit. */ |
| 1980 | * (However, in principle we could allow some cases, e.g. | 2038 | verbose(env, "R%d bitwise operator %s on pointer prohibited\n", |
| 1981 | * ptr &= ~3 which would reduce min_value by 3.) | 2039 | dst, bpf_alu_string[opcode >> 4]); |
| 1982 | */ | ||
| 1983 | if (!env->allow_ptr_leaks) | ||
| 1984 | verbose(env, "R%d bitwise operator %s on pointer prohibited\n", | ||
| 1985 | dst, bpf_alu_string[opcode >> 4]); | ||
| 1986 | return -EACCES; | 2040 | return -EACCES; |
| 1987 | default: | 2041 | default: |
| 1988 | /* other operators (e.g. MUL,LSH) produce non-pointer results */ | 2042 | /* other operators (e.g. MUL,LSH) produce non-pointer results */ |
| 1989 | if (!env->allow_ptr_leaks) | 2043 | verbose(env, "R%d pointer arithmetic with %s operator prohibited\n", |
| 1990 | verbose(env, "R%d pointer arithmetic with %s operator prohibited\n", | 2044 | dst, bpf_alu_string[opcode >> 4]); |
| 1991 | dst, bpf_alu_string[opcode >> 4]); | ||
| 1992 | return -EACCES; | 2045 | return -EACCES; |
| 1993 | } | 2046 | } |
| 1994 | 2047 | ||
| 2048 | if (!check_reg_sane_offset(env, dst_reg, ptr_reg->type)) | ||
| 2049 | return -EINVAL; | ||
| 2050 | |||
| 1995 | __update_reg_bounds(dst_reg); | 2051 | __update_reg_bounds(dst_reg); |
| 1996 | __reg_deduce_bounds(dst_reg); | 2052 | __reg_deduce_bounds(dst_reg); |
| 1997 | __reg_bound_offset(dst_reg); | 2053 | __reg_bound_offset(dst_reg); |
| 1998 | return 0; | 2054 | return 0; |
| 1999 | } | 2055 | } |
| 2000 | 2056 | ||
| 2057 | /* WARNING: This function does calculations on 64-bit values, but the actual | ||
| 2058 | * execution may occur on 32-bit values. Therefore, things like bitshifts | ||
| 2059 | * need extra checks in the 32-bit case. | ||
| 2060 | */ | ||
| 2001 | static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env, | 2061 | static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env, |
| 2002 | struct bpf_insn *insn, | 2062 | struct bpf_insn *insn, |
| 2003 | struct bpf_reg_state *dst_reg, | 2063 | struct bpf_reg_state *dst_reg, |
| @@ -2008,12 +2068,8 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env, | |||
| 2008 | bool src_known, dst_known; | 2068 | bool src_known, dst_known; |
| 2009 | s64 smin_val, smax_val; | 2069 | s64 smin_val, smax_val; |
| 2010 | u64 umin_val, umax_val; | 2070 | u64 umin_val, umax_val; |
| 2071 | u64 insn_bitness = (BPF_CLASS(insn->code) == BPF_ALU64) ? 64 : 32; | ||
| 2011 | 2072 | ||
| 2012 | if (BPF_CLASS(insn->code) != BPF_ALU64) { | ||
| 2013 | /* 32-bit ALU ops are (32,32)->64 */ | ||
| 2014 | coerce_reg_to_32(dst_reg); | ||
| 2015 | coerce_reg_to_32(&src_reg); | ||
| 2016 | } | ||
| 2017 | smin_val = src_reg.smin_value; | 2073 | smin_val = src_reg.smin_value; |
| 2018 | smax_val = src_reg.smax_value; | 2074 | smax_val = src_reg.smax_value; |
| 2019 | umin_val = src_reg.umin_value; | 2075 | umin_val = src_reg.umin_value; |
| @@ -2021,6 +2077,12 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env, | |||
| 2021 | src_known = tnum_is_const(src_reg.var_off); | 2077 | src_known = tnum_is_const(src_reg.var_off); |
| 2022 | dst_known = tnum_is_const(dst_reg->var_off); | 2078 | dst_known = tnum_is_const(dst_reg->var_off); |
| 2023 | 2079 | ||
| 2080 | if (!src_known && | ||
| 2081 | opcode != BPF_ADD && opcode != BPF_SUB && opcode != BPF_AND) { | ||
| 2082 | __mark_reg_unknown(dst_reg); | ||
| 2083 | return 0; | ||
| 2084 | } | ||
| 2085 | |||
| 2024 | switch (opcode) { | 2086 | switch (opcode) { |
| 2025 | case BPF_ADD: | 2087 | case BPF_ADD: |
| 2026 | if (signed_add_overflows(dst_reg->smin_value, smin_val) || | 2088 | if (signed_add_overflows(dst_reg->smin_value, smin_val) || |
| @@ -2149,9 +2211,9 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env, | |||
| 2149 | __update_reg_bounds(dst_reg); | 2211 | __update_reg_bounds(dst_reg); |
| 2150 | break; | 2212 | break; |
| 2151 | case BPF_LSH: | 2213 | case BPF_LSH: |
| 2152 | if (umax_val > 63) { | 2214 | if (umax_val >= insn_bitness) { |
| 2153 | /* Shifts greater than 63 are undefined. This includes | 2215 | /* Shifts greater than 31 or 63 are undefined. |
| 2154 | * shifts by a negative number. | 2216 | * This includes shifts by a negative number. |
| 2155 | */ | 2217 | */ |
| 2156 | mark_reg_unknown(env, regs, insn->dst_reg); | 2218 | mark_reg_unknown(env, regs, insn->dst_reg); |
| 2157 | break; | 2219 | break; |
| @@ -2177,27 +2239,29 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env, | |||
| 2177 | __update_reg_bounds(dst_reg); | 2239 | __update_reg_bounds(dst_reg); |
| 2178 | break; | 2240 | break; |
| 2179 | case BPF_RSH: | 2241 | case BPF_RSH: |
| 2180 | if (umax_val > 63) { | 2242 | if (umax_val >= insn_bitness) { |
| 2181 | /* Shifts greater than 63 are undefined. This includes | 2243 | /* Shifts greater than 31 or 63 are undefined. |
| 2182 | * shifts by a negative number. | 2244 | * This includes shifts by a negative number. |
| 2183 | */ | 2245 | */ |
| 2184 | mark_reg_unknown(env, regs, insn->dst_reg); | 2246 | mark_reg_unknown(env, regs, insn->dst_reg); |
| 2185 | break; | 2247 | break; |
| 2186 | } | 2248 | } |
| 2187 | /* BPF_RSH is an unsigned shift, so make the appropriate casts */ | 2249 | /* BPF_RSH is an unsigned shift. If the value in dst_reg might |
| 2188 | if (dst_reg->smin_value < 0) { | 2250 | * be negative, then either: |
| 2189 | if (umin_val) { | 2251 | * 1) src_reg might be zero, so the sign bit of the result is |
| 2190 | /* Sign bit will be cleared */ | 2252 | * unknown, so we lose our signed bounds |
| 2191 | dst_reg->smin_value = 0; | 2253 | * 2) it's known negative, thus the unsigned bounds capture the |
| 2192 | } else { | 2254 | * signed bounds |
| 2193 | /* Lost sign bit information */ | 2255 | * 3) the signed bounds cross zero, so they tell us nothing |
| 2194 | dst_reg->smin_value = S64_MIN; | 2256 | * about the result |
| 2195 | dst_reg->smax_value = S64_MAX; | 2257 | * If the value in dst_reg is known nonnegative, then again the |
| 2196 | } | 2258 | * unsigned bounts capture the signed bounds. |
| 2197 | } else { | 2259 | * Thus, in all cases it suffices to blow away our signed bounds |
| 2198 | dst_reg->smin_value = | 2260 | * and rely on inferring new ones from the unsigned bounds and |
| 2199 | (u64)(dst_reg->smin_value) >> umax_val; | 2261 | * var_off of the result. |
| 2200 | } | 2262 | */ |
| 2263 | dst_reg->smin_value = S64_MIN; | ||
| 2264 | dst_reg->smax_value = S64_MAX; | ||
| 2201 | if (src_known) | 2265 | if (src_known) |
| 2202 | dst_reg->var_off = tnum_rshift(dst_reg->var_off, | 2266 | dst_reg->var_off = tnum_rshift(dst_reg->var_off, |
| 2203 | umin_val); | 2267 | umin_val); |
| @@ -2213,6 +2277,12 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env, | |||
| 2213 | break; | 2277 | break; |
| 2214 | } | 2278 | } |
| 2215 | 2279 | ||
| 2280 | if (BPF_CLASS(insn->code) != BPF_ALU64) { | ||
| 2281 | /* 32-bit ALU ops are (32,32)->32 */ | ||
| 2282 | coerce_reg_to_size(dst_reg, 4); | ||
| 2283 | coerce_reg_to_size(&src_reg, 4); | ||
| 2284 | } | ||
| 2285 | |||
| 2216 | __reg_deduce_bounds(dst_reg); | 2286 | __reg_deduce_bounds(dst_reg); |
| 2217 | __reg_bound_offset(dst_reg); | 2287 | __reg_bound_offset(dst_reg); |
| 2218 | return 0; | 2288 | return 0; |
| @@ -2227,7 +2297,6 @@ static int adjust_reg_min_max_vals(struct bpf_verifier_env *env, | |||
| 2227 | struct bpf_reg_state *regs = cur_regs(env), *dst_reg, *src_reg; | 2297 | struct bpf_reg_state *regs = cur_regs(env), *dst_reg, *src_reg; |
| 2228 | struct bpf_reg_state *ptr_reg = NULL, off_reg = {0}; | 2298 | struct bpf_reg_state *ptr_reg = NULL, off_reg = {0}; |
| 2229 | u8 opcode = BPF_OP(insn->code); | 2299 | u8 opcode = BPF_OP(insn->code); |
| 2230 | int rc; | ||
| 2231 | 2300 | ||
| 2232 | dst_reg = ®s[insn->dst_reg]; | 2301 | dst_reg = ®s[insn->dst_reg]; |
| 2233 | src_reg = NULL; | 2302 | src_reg = NULL; |
| @@ -2238,43 +2307,29 @@ static int adjust_reg_min_max_vals(struct bpf_verifier_env *env, | |||
| 2238 | if (src_reg->type != SCALAR_VALUE) { | 2307 | if (src_reg->type != SCALAR_VALUE) { |
| 2239 | if (dst_reg->type != SCALAR_VALUE) { | 2308 | if (dst_reg->type != SCALAR_VALUE) { |
| 2240 | /* Combining two pointers by any ALU op yields | 2309 | /* Combining two pointers by any ALU op yields |
| 2241 | * an arbitrary scalar. | 2310 | * an arbitrary scalar. Disallow all math except |
| 2311 | * pointer subtraction | ||
| 2242 | */ | 2312 | */ |
| 2243 | if (!env->allow_ptr_leaks) { | 2313 | if (opcode == BPF_SUB){ |
| 2244 | verbose(env, "R%d pointer %s pointer prohibited\n", | 2314 | mark_reg_unknown(env, regs, insn->dst_reg); |
| 2245 | insn->dst_reg, | 2315 | return 0; |
| 2246 | bpf_alu_string[opcode >> 4]); | ||
| 2247 | return -EACCES; | ||
| 2248 | } | 2316 | } |
| 2249 | mark_reg_unknown(env, regs, insn->dst_reg); | 2317 | verbose(env, "R%d pointer %s pointer prohibited\n", |
| 2250 | return 0; | 2318 | insn->dst_reg, |
| 2319 | bpf_alu_string[opcode >> 4]); | ||
| 2320 | return -EACCES; | ||
| 2251 | } else { | 2321 | } else { |
| 2252 | /* scalar += pointer | 2322 | /* scalar += pointer |
| 2253 | * This is legal, but we have to reverse our | 2323 | * This is legal, but we have to reverse our |
| 2254 | * src/dest handling in computing the range | 2324 | * src/dest handling in computing the range |
| 2255 | */ | 2325 | */ |
| 2256 | rc = adjust_ptr_min_max_vals(env, insn, | 2326 | return adjust_ptr_min_max_vals(env, insn, |
| 2257 | src_reg, dst_reg); | 2327 | src_reg, dst_reg); |
| 2258 | if (rc == -EACCES && env->allow_ptr_leaks) { | ||
| 2259 | /* scalar += unknown scalar */ | ||
| 2260 | __mark_reg_unknown(&off_reg); | ||
| 2261 | return adjust_scalar_min_max_vals( | ||
| 2262 | env, insn, | ||
| 2263 | dst_reg, off_reg); | ||
| 2264 | } | ||
| 2265 | return rc; | ||
| 2266 | } | 2328 | } |
| 2267 | } else if (ptr_reg) { | 2329 | } else if (ptr_reg) { |
| 2268 | /* pointer += scalar */ | 2330 | /* pointer += scalar */ |
| 2269 | rc = adjust_ptr_min_max_vals(env, insn, | 2331 | return adjust_ptr_min_max_vals(env, insn, |
| 2270 | dst_reg, src_reg); | 2332 | dst_reg, src_reg); |
| 2271 | if (rc == -EACCES && env->allow_ptr_leaks) { | ||
| 2272 | /* unknown scalar += scalar */ | ||
| 2273 | __mark_reg_unknown(dst_reg); | ||
| 2274 | return adjust_scalar_min_max_vals( | ||
| 2275 | env, insn, dst_reg, *src_reg); | ||
| 2276 | } | ||
| 2277 | return rc; | ||
| 2278 | } | 2333 | } |
| 2279 | } else { | 2334 | } else { |
| 2280 | /* Pretend the src is a reg with a known value, since we only | 2335 | /* Pretend the src is a reg with a known value, since we only |
| @@ -2283,17 +2338,9 @@ static int adjust_reg_min_max_vals(struct bpf_verifier_env *env, | |||
| 2283 | off_reg.type = SCALAR_VALUE; | 2338 | off_reg.type = SCALAR_VALUE; |
| 2284 | __mark_reg_known(&off_reg, insn->imm); | 2339 | __mark_reg_known(&off_reg, insn->imm); |
| 2285 | src_reg = &off_reg; | 2340 | src_reg = &off_reg; |
| 2286 | if (ptr_reg) { /* pointer += K */ | 2341 | if (ptr_reg) /* pointer += K */ |
| 2287 | rc = adjust_ptr_min_max_vals(env, insn, | 2342 | return adjust_ptr_min_max_vals(env, insn, |
| 2288 | ptr_reg, src_reg); | 2343 | ptr_reg, src_reg); |
| 2289 | if (rc == -EACCES && env->allow_ptr_leaks) { | ||
| 2290 | /* unknown scalar += K */ | ||
| 2291 | __mark_reg_unknown(dst_reg); | ||
| 2292 | return adjust_scalar_min_max_vals( | ||
| 2293 | env, insn, dst_reg, off_reg); | ||
| 2294 | } | ||
| 2295 | return rc; | ||
| 2296 | } | ||
| 2297 | } | 2344 | } |
| 2298 | 2345 | ||
| 2299 | /* Got here implies adding two SCALAR_VALUEs */ | 2346 | /* Got here implies adding two SCALAR_VALUEs */ |
| @@ -2390,17 +2437,20 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn) | |||
| 2390 | return -EACCES; | 2437 | return -EACCES; |
| 2391 | } | 2438 | } |
| 2392 | mark_reg_unknown(env, regs, insn->dst_reg); | 2439 | mark_reg_unknown(env, regs, insn->dst_reg); |
| 2393 | /* high 32 bits are known zero. */ | 2440 | coerce_reg_to_size(®s[insn->dst_reg], 4); |
| 2394 | regs[insn->dst_reg].var_off = tnum_cast( | ||
| 2395 | regs[insn->dst_reg].var_off, 4); | ||
| 2396 | __update_reg_bounds(®s[insn->dst_reg]); | ||
| 2397 | } | 2441 | } |
| 2398 | } else { | 2442 | } else { |
| 2399 | /* case: R = imm | 2443 | /* case: R = imm |
| 2400 | * remember the value we stored into this reg | 2444 | * remember the value we stored into this reg |
| 2401 | */ | 2445 | */ |
| 2402 | regs[insn->dst_reg].type = SCALAR_VALUE; | 2446 | regs[insn->dst_reg].type = SCALAR_VALUE; |
| 2403 | __mark_reg_known(regs + insn->dst_reg, insn->imm); | 2447 | if (BPF_CLASS(insn->code) == BPF_ALU64) { |
| 2448 | __mark_reg_known(regs + insn->dst_reg, | ||
| 2449 | insn->imm); | ||
| 2450 | } else { | ||
| 2451 | __mark_reg_known(regs + insn->dst_reg, | ||
| 2452 | (u32)insn->imm); | ||
| 2453 | } | ||
| 2404 | } | 2454 | } |
| 2405 | 2455 | ||
| 2406 | } else if (opcode > BPF_END) { | 2456 | } else if (opcode > BPF_END) { |
| @@ -3431,15 +3481,14 @@ static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur, | |||
| 3431 | return range_within(rold, rcur) && | 3481 | return range_within(rold, rcur) && |
| 3432 | tnum_in(rold->var_off, rcur->var_off); | 3482 | tnum_in(rold->var_off, rcur->var_off); |
| 3433 | } else { | 3483 | } else { |
| 3434 | /* if we knew anything about the old value, we're not | 3484 | /* We're trying to use a pointer in place of a scalar. |
| 3435 | * equal, because we can't know anything about the | 3485 | * Even if the scalar was unbounded, this could lead to |
| 3436 | * scalar value of the pointer in the new value. | 3486 | * pointer leaks because scalars are allowed to leak |
| 3487 | * while pointers are not. We could make this safe in | ||
| 3488 | * special cases if root is calling us, but it's | ||
| 3489 | * probably not worth the hassle. | ||
| 3437 | */ | 3490 | */ |
| 3438 | return rold->umin_value == 0 && | 3491 | return false; |
| 3439 | rold->umax_value == U64_MAX && | ||
| 3440 | rold->smin_value == S64_MIN && | ||
| 3441 | rold->smax_value == S64_MAX && | ||
| 3442 | tnum_is_unknown(rold->var_off); | ||
| 3443 | } | 3492 | } |
| 3444 | case PTR_TO_MAP_VALUE: | 3493 | case PTR_TO_MAP_VALUE: |
| 3445 | /* If the new min/max/var_off satisfy the old ones and | 3494 | /* If the new min/max/var_off satisfy the old ones and |
