diff options
| author | Hitendra Prajapati <hprajapati@mvista.com> | 2022-11-16 16:44:10 +0530 |
|---|---|---|
| committer | Armin Kuster <akuster808@gmail.com> | 2022-11-19 11:14:34 -0500 |
| commit | ba5ccfceb8bb63a127e70d84bfa95f8ccdca8233 (patch) | |
| tree | 025f1f5680a02719086a2d54b799956ef109a73a | |
| parent | 94d737223bf5f8c4fd035f73b5ff2b4b11b32c57 (diff) | |
| download | meta-openembedded-ba5ccfceb8bb63a127e70d84bfa95f8ccdca8233.tar.gz | |
nginx: CVE-2022-41741, CVE-2022-41742 Memory corruption in the ngx_http_mp4_module
Upstream-Status: Backport from https://github.com/nginx/nginx/commit/6b022a5556af22b6e18532e547a6ae46b0d8c6ea
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
| -rw-r--r-- | meta-webserver/recipes-httpd/nginx/files/CVE-2022-41741-CVE-2022-41742.patch | 319 | ||||
| -rw-r--r-- | meta-webserver/recipes-httpd/nginx/nginx_1.20.1.bb | 4 |
2 files changed, 322 insertions, 1 deletions
diff --git a/meta-webserver/recipes-httpd/nginx/files/CVE-2022-41741-CVE-2022-41742.patch b/meta-webserver/recipes-httpd/nginx/files/CVE-2022-41741-CVE-2022-41742.patch new file mode 100644 index 0000000000..d151256b37 --- /dev/null +++ b/meta-webserver/recipes-httpd/nginx/files/CVE-2022-41741-CVE-2022-41742.patch | |||
| @@ -0,0 +1,319 @@ | |||
| 1 | From 91a3b5302d6a2467df70d3b43450991a53f9946b Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Hitendra Prajapati <hprajapati@mvista.com> | ||
| 3 | Date: Wed, 16 Nov 2022 11:24:25 +0530 | ||
| 4 | Subject: [PATCH] CVE-2022-41741, CVE-2022-41742 | ||
| 5 | |||
| 6 | Upstream-Status: Backport [https://github.com/nginx/nginx/commit/6b022a5556af22b6e18532e547a6ae46b0d8c6ea] | ||
| 7 | CVE: CVE-2022-41741, CVE-2022-41742 | ||
| 8 | Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com> | ||
| 9 | |||
| 10 | Mp4: disabled duplicate atoms. | ||
| 11 | |||
| 12 | Most atoms should not appear more than once in a container. Previously, | ||
| 13 | this was not enforced by the module, which could result in worker process | ||
| 14 | crash, memory corruption and disclosure. | ||
| 15 | --- | ||
| 16 | src/http/modules/ngx_http_mp4_module.c | 147 +++++++++++++++++++++++++ | ||
| 17 | 1 file changed, 147 insertions(+) | ||
| 18 | |||
| 19 | diff --git a/src/http/modules/ngx_http_mp4_module.c b/src/http/modules/ngx_http_mp4_module.c | ||
| 20 | index 0e93fbd..4f4d89d 100644 | ||
| 21 | --- a/src/http/modules/ngx_http_mp4_module.c | ||
| 22 | +++ b/src/http/modules/ngx_http_mp4_module.c | ||
| 23 | @@ -1070,6 +1070,12 @@ ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 24 | return NGX_ERROR; | ||
| 25 | } | ||
| 26 | |||
| 27 | + if (mp4->ftyp_atom.buf) { | ||
| 28 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 29 | + "duplicate mp4 ftyp atom in \"%s\"", mp4->file.name.data); | ||
| 30 | + return NGX_ERROR; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; | ||
| 34 | |||
| 35 | ftyp_atom = ngx_palloc(mp4->request->pool, atom_size); | ||
| 36 | @@ -1128,6 +1134,12 @@ ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 37 | return NGX_DECLINED; | ||
| 38 | } | ||
| 39 | |||
| 40 | + if (mp4->moov_atom.buf) { | ||
| 41 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 42 | + "duplicate mp4 moov atom in \"%s\"", mp4->file.name.data); | ||
| 43 | + return NGX_ERROR; | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module); | ||
| 47 | |||
| 48 | if (atom_data_size > mp4->buffer_size) { | ||
| 49 | @@ -1195,6 +1207,12 @@ ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 50 | |||
| 51 | ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdat atom"); | ||
| 52 | |||
| 53 | + if (mp4->mdat_atom.buf) { | ||
| 54 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 55 | + "duplicate mp4 mdat atom in \"%s\"", mp4->file.name.data); | ||
| 56 | + return NGX_ERROR; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | data = &mp4->mdat_data_buf; | ||
| 60 | data->file = &mp4->file; | ||
| 61 | data->in_file = 1; | ||
| 62 | @@ -1321,6 +1339,12 @@ ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 63 | |||
| 64 | ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mvhd atom"); | ||
| 65 | |||
| 66 | + if (mp4->mvhd_atom.buf) { | ||
| 67 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 68 | + "duplicate mp4 mvhd atom in \"%s\"", mp4->file.name.data); | ||
| 69 | + return NGX_ERROR; | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | atom_header = ngx_mp4_atom_header(mp4); | ||
| 73 | mvhd_atom = (ngx_mp4_mvhd_atom_t *) atom_header; | ||
| 74 | mvhd64_atom = (ngx_mp4_mvhd64_atom_t *) atom_header; | ||
| 75 | @@ -1586,6 +1610,13 @@ ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 76 | atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; | ||
| 77 | |||
| 78 | trak = ngx_mp4_last_trak(mp4); | ||
| 79 | + | ||
| 80 | + if (trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf) { | ||
| 81 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 82 | + "duplicate mp4 tkhd atom in \"%s\"", mp4->file.name.data); | ||
| 83 | + return NGX_ERROR; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | trak->tkhd_size = atom_size; | ||
| 87 | |||
| 88 | ngx_mp4_set_32value(tkhd_atom->size, atom_size); | ||
| 89 | @@ -1624,6 +1655,12 @@ ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 90 | |||
| 91 | trak = ngx_mp4_last_trak(mp4); | ||
| 92 | |||
| 93 | + if (trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf) { | ||
| 94 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 95 | + "duplicate mp4 mdia atom in \"%s\"", mp4->file.name.data); | ||
| 96 | + return NGX_ERROR; | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | atom = &trak->mdia_atom_buf; | ||
| 100 | atom->temporary = 1; | ||
| 101 | atom->pos = atom_header; | ||
| 102 | @@ -1747,6 +1784,13 @@ ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 103 | atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; | ||
| 104 | |||
| 105 | trak = ngx_mp4_last_trak(mp4); | ||
| 106 | + | ||
| 107 | + if (trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf) { | ||
| 108 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 109 | + "duplicate mp4 mdhd atom in \"%s\"", mp4->file.name.data); | ||
| 110 | + return NGX_ERROR; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | trak->mdhd_size = atom_size; | ||
| 114 | trak->timescale = timescale; | ||
| 115 | |||
| 116 | @@ -1789,6 +1833,12 @@ ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 117 | |||
| 118 | trak = ngx_mp4_last_trak(mp4); | ||
| 119 | |||
| 120 | + if (trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf) { | ||
| 121 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 122 | + "duplicate mp4 hdlr atom in \"%s\"", mp4->file.name.data); | ||
| 123 | + return NGX_ERROR; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | atom = &trak->hdlr_atom_buf; | ||
| 127 | atom->temporary = 1; | ||
| 128 | atom->pos = atom_header; | ||
| 129 | @@ -1817,6 +1867,12 @@ ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 130 | |||
| 131 | trak = ngx_mp4_last_trak(mp4); | ||
| 132 | |||
| 133 | + if (trak->out[NGX_HTTP_MP4_MINF_ATOM].buf) { | ||
| 134 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 135 | + "duplicate mp4 minf atom in \"%s\"", mp4->file.name.data); | ||
| 136 | + return NGX_ERROR; | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | atom = &trak->minf_atom_buf; | ||
| 140 | atom->temporary = 1; | ||
| 141 | atom->pos = atom_header; | ||
| 142 | @@ -1860,6 +1916,15 @@ ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 143 | |||
| 144 | trak = ngx_mp4_last_trak(mp4); | ||
| 145 | |||
| 146 | + if (trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf | ||
| 147 | + || trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf) | ||
| 148 | + { | ||
| 149 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 150 | + "duplicate mp4 vmhd/smhd atom in \"%s\"", | ||
| 151 | + mp4->file.name.data); | ||
| 152 | + return NGX_ERROR; | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | atom = &trak->vmhd_atom_buf; | ||
| 156 | atom->temporary = 1; | ||
| 157 | atom->pos = atom_header; | ||
| 158 | @@ -1891,6 +1956,15 @@ ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 159 | |||
| 160 | trak = ngx_mp4_last_trak(mp4); | ||
| 161 | |||
| 162 | + if (trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf | ||
| 163 | + || trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf) | ||
| 164 | + { | ||
| 165 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 166 | + "duplicate mp4 vmhd/smhd atom in \"%s\"", | ||
| 167 | + mp4->file.name.data); | ||
| 168 | + return NGX_ERROR; | ||
| 169 | + } | ||
| 170 | + | ||
| 171 | atom = &trak->smhd_atom_buf; | ||
| 172 | atom->temporary = 1; | ||
| 173 | atom->pos = atom_header; | ||
| 174 | @@ -1922,6 +1996,12 @@ ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 175 | |||
| 176 | trak = ngx_mp4_last_trak(mp4); | ||
| 177 | |||
| 178 | + if (trak->out[NGX_HTTP_MP4_DINF_ATOM].buf) { | ||
| 179 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 180 | + "duplicate mp4 dinf atom in \"%s\"", mp4->file.name.data); | ||
| 181 | + return NGX_ERROR; | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | atom = &trak->dinf_atom_buf; | ||
| 185 | atom->temporary = 1; | ||
| 186 | atom->pos = atom_header; | ||
| 187 | @@ -1950,6 +2030,12 @@ ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 188 | |||
| 189 | trak = ngx_mp4_last_trak(mp4); | ||
| 190 | |||
| 191 | + if (trak->out[NGX_HTTP_MP4_STBL_ATOM].buf) { | ||
| 192 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 193 | + "duplicate mp4 stbl atom in \"%s\"", mp4->file.name.data); | ||
| 194 | + return NGX_ERROR; | ||
| 195 | + } | ||
| 196 | + | ||
| 197 | atom = &trak->stbl_atom_buf; | ||
| 198 | atom->temporary = 1; | ||
| 199 | atom->pos = atom_header; | ||
| 200 | @@ -2018,6 +2104,12 @@ ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 201 | |||
| 202 | trak = ngx_mp4_last_trak(mp4); | ||
| 203 | |||
| 204 | + if (trak->out[NGX_HTTP_MP4_STSD_ATOM].buf) { | ||
| 205 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 206 | + "duplicate mp4 stsd atom in \"%s\"", mp4->file.name.data); | ||
| 207 | + return NGX_ERROR; | ||
| 208 | + } | ||
| 209 | + | ||
| 210 | atom = &trak->stsd_atom_buf; | ||
| 211 | atom->temporary = 1; | ||
| 212 | atom->pos = atom_header; | ||
| 213 | @@ -2086,6 +2178,13 @@ ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 214 | atom_end = atom_table + entries * sizeof(ngx_mp4_stts_entry_t); | ||
| 215 | |||
| 216 | trak = ngx_mp4_last_trak(mp4); | ||
| 217 | + | ||
| 218 | + if (trak->out[NGX_HTTP_MP4_STTS_ATOM].buf) { | ||
| 219 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 220 | + "duplicate mp4 stts atom in \"%s\"", mp4->file.name.data); | ||
| 221 | + return NGX_ERROR; | ||
| 222 | + } | ||
| 223 | + | ||
| 224 | trak->time_to_sample_entries = entries; | ||
| 225 | |||
| 226 | atom = &trak->stts_atom_buf; | ||
| 227 | @@ -2291,6 +2390,13 @@ ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 228 | "sync sample entries:%uD", entries); | ||
| 229 | |||
| 230 | trak = ngx_mp4_last_trak(mp4); | ||
| 231 | + | ||
| 232 | + if (trak->out[NGX_HTTP_MP4_STSS_ATOM].buf) { | ||
| 233 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 234 | + "duplicate mp4 stss atom in \"%s\"", mp4->file.name.data); | ||
| 235 | + return NGX_ERROR; | ||
| 236 | + } | ||
| 237 | + | ||
| 238 | trak->sync_samples_entries = entries; | ||
| 239 | |||
| 240 | atom_table = atom_header + sizeof(ngx_http_mp4_stss_atom_t); | ||
| 241 | @@ -2489,6 +2595,13 @@ ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 242 | "composition offset entries:%uD", entries); | ||
| 243 | |||
| 244 | trak = ngx_mp4_last_trak(mp4); | ||
| 245 | + | ||
| 246 | + if (trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf) { | ||
| 247 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 248 | + "duplicate mp4 ctts atom in \"%s\"", mp4->file.name.data); | ||
| 249 | + return NGX_ERROR; | ||
| 250 | + } | ||
| 251 | + | ||
| 252 | trak->composition_offset_entries = entries; | ||
| 253 | |||
| 254 | atom_table = atom_header + sizeof(ngx_mp4_ctts_atom_t); | ||
| 255 | @@ -2692,6 +2805,13 @@ ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 256 | atom_end = atom_table + entries * sizeof(ngx_mp4_stsc_entry_t); | ||
| 257 | |||
| 258 | trak = ngx_mp4_last_trak(mp4); | ||
| 259 | + | ||
| 260 | + if (trak->out[NGX_HTTP_MP4_STSC_ATOM].buf) { | ||
| 261 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 262 | + "duplicate mp4 stsc atom in \"%s\"", mp4->file.name.data); | ||
| 263 | + return NGX_ERROR; | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | trak->sample_to_chunk_entries = entries; | ||
| 267 | |||
| 268 | atom = &trak->stsc_atom_buf; | ||
| 269 | @@ -3024,6 +3144,13 @@ ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 270 | "sample uniform size:%uD, entries:%uD", size, entries); | ||
| 271 | |||
| 272 | trak = ngx_mp4_last_trak(mp4); | ||
| 273 | + | ||
| 274 | + if (trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf) { | ||
| 275 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 276 | + "duplicate mp4 stsz atom in \"%s\"", mp4->file.name.data); | ||
| 277 | + return NGX_ERROR; | ||
| 278 | + } | ||
| 279 | + | ||
| 280 | trak->sample_sizes_entries = entries; | ||
| 281 | |||
| 282 | atom_table = atom_header + sizeof(ngx_mp4_stsz_atom_t); | ||
| 283 | @@ -3207,6 +3334,16 @@ ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 284 | atom_end = atom_table + entries * sizeof(uint32_t); | ||
| 285 | |||
| 286 | trak = ngx_mp4_last_trak(mp4); | ||
| 287 | + | ||
| 288 | + if (trak->out[NGX_HTTP_MP4_STCO_ATOM].buf | ||
| 289 | + || trak->out[NGX_HTTP_MP4_CO64_ATOM].buf) | ||
| 290 | + { | ||
| 291 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 292 | + "duplicate mp4 stco/co64 atom in \"%s\"", | ||
| 293 | + mp4->file.name.data); | ||
| 294 | + return NGX_ERROR; | ||
| 295 | + } | ||
| 296 | + | ||
| 297 | trak->chunks = entries; | ||
| 298 | |||
| 299 | atom = &trak->stco_atom_buf; | ||
| 300 | @@ -3413,6 +3550,16 @@ ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) | ||
| 301 | atom_end = atom_table + entries * sizeof(uint64_t); | ||
| 302 | |||
| 303 | trak = ngx_mp4_last_trak(mp4); | ||
| 304 | + | ||
| 305 | + if (trak->out[NGX_HTTP_MP4_STCO_ATOM].buf | ||
| 306 | + || trak->out[NGX_HTTP_MP4_CO64_ATOM].buf) | ||
| 307 | + { | ||
| 308 | + ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, | ||
| 309 | + "duplicate mp4 stco/co64 atom in \"%s\"", | ||
| 310 | + mp4->file.name.data); | ||
| 311 | + return NGX_ERROR; | ||
| 312 | + } | ||
| 313 | + | ||
| 314 | trak->chunks = entries; | ||
| 315 | |||
| 316 | atom = &trak->co64_atom_buf; | ||
| 317 | -- | ||
| 318 | 2.25.1 | ||
| 319 | |||
diff --git a/meta-webserver/recipes-httpd/nginx/nginx_1.20.1.bb b/meta-webserver/recipes-httpd/nginx/nginx_1.20.1.bb index d686c627f2..09a1b45591 100644 --- a/meta-webserver/recipes-httpd/nginx/nginx_1.20.1.bb +++ b/meta-webserver/recipes-httpd/nginx/nginx_1.20.1.bb | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | require nginx.inc | 1 | require nginx.inc |
| 2 | 2 | ||
| 3 | SRC_URI += "file://CVE-2021-3618.patch" | 3 | SRC_URI += "file://CVE-2021-3618.patch \ |
| 4 | file://CVE-2022-41741-CVE-2022-41742.patch \ | ||
| 5 | " | ||
| 4 | 6 | ||
| 5 | LIC_FILES_CHKSUM = "file://LICENSE;md5=206629dc7c7b3e87acb31162363ae505" | 7 | LIC_FILES_CHKSUM = "file://LICENSE;md5=206629dc7c7b3e87acb31162363ae505" |
| 6 | 8 | ||
