From patchwork Wed Aug 17 22:32:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 37334 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp349264pzh; Wed, 17 Aug 2022 15:33:10 -0700 (PDT) X-Google-Smtp-Source: AA6agR72/4oS9+CWytlz4Tzr9q9SqqPFj5FhwnUl1k3n0/FthhykuRx6pc+yf4+D84wECf6BtP7A X-Received: by 2002:aa7:cb92:0:b0:443:98d6:20da with SMTP id r18-20020aa7cb92000000b0044398d620damr140482edt.399.1660775590148; Wed, 17 Aug 2022 15:33:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660775590; cv=none; d=google.com; s=arc-20160816; b=My1/yKrS+ROqEGc8HVn24F668UT39YCQghqdoXgY3/j/EJarFa0+mJQAWgK7H60fW5 k0gA1ojrrFcJhX2Mh6fKft1utOjLXRhhKmTm8iQT0cmUFA7/TbDmIAQTTB1fSpwDT0N+ 6YnwlG7bWUeLELedRGzRnURioqO0uxlTg7J/0IxpeOri+5KA1709NEctreKlIXiG3SkL hyXSS2ZwurNXWGTh8GIl6ausPoBZFq7Tiq0fZT0Pg6mjt5oxyn+78/LSk/oAqfBQ9bDh yl5QX6O/ClGgRPAWdkf+TNKfuA37JWAKWuZDNHfuaN5AmAzh46zSA8O1TsGXyM9xIfCa P+xA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to; bh=+62rpDSHLtPS6PiT0ZX/9Czzy+nJxbUADwa3ElxKt8A=; b=QUFLDF/XXheCIDS6tyUn/R1T1hbEWEVyZDxghfmW9rFVrABvTbGZFqXLC5DGuTK5z6 YmdY3grOM53hYtEFAKYsBpg2r/JqHvHvURf085+RVS/N06u5IR3w+KR5oiDw2jroTe2C 6/VuUzwho4p2HGpR1vcqnm847UcRoEVI4Cu6+FmA61Ce5Y+MWLZcdIODdQBjJF/FqE5V Tf/Pm8w0JL+rDBxUUYE8eSBEzQHjEqTnfRDxm2csHYRhL6e1rGiBG+lBQbGJteHMH8M0 uLHDBNKVOEflga1evJoFl+pzYZfvwUpvWdBnVVAp4Mf7PjLv6vpyNm/K1taMC7KPVUaS GYhA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t8-20020a056402524800b0043d4293adbasi1654087edd.506.2022.08.17.15.33.09; Wed, 17 Aug 2022 15:33:10 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F1B0168B93E; Thu, 18 Aug 2022 01:33:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vie01a-dmta-at03-2.mx.upcmail.net (vie01a-dmta-at03-2.mx.upcmail.net [62.179.121.152]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CF82B68B8A6 for ; Thu, 18 Aug 2022 01:32:59 +0300 (EEST) Received: from [172.31.216.235] (helo=vie01a-pemc-psmtp-pe12.mail.upcmail.net) by vie01a-dmta-at03.mx.upcmail.net with esmtp (Exim 4.92) (envelope-from ) id 1oORas-00FLCk-Js for ffmpeg-devel@ffmpeg.org; Thu, 18 Aug 2022 00:32:58 +0200 Received: from ren-mail-psmtp-mg02. ([80.109.253.241]) by vie01a-pemc-psmtp-pe12.mail.upcmail.net with ESMTP id ORasob1ZS8s8UORasohH8k; Thu, 18 Aug 2022 00:32:58 +0200 Received: from localhost ([213.47.68.29]) by ren-mail-psmtp-mg02. with ESMTP id ORaron56c8eSWORaromhWj; Thu, 18 Aug 2022 00:32:57 +0200 X-Env-Mailfrom: michael@niedermayer.cc X-Env-Rcptto: ffmpeg-devel@ffmpeg.org X-SourceIP: 213.47.68.29 X-CNFS-Analysis: v=2.4 cv=KKE5sHJo c=1 sm=1 tr=0 ts=62fd6c99 a=2hcxjKEKjp0CzLx6oWAm4g==:117 a=2hcxjKEKjp0CzLx6oWAm4g==:17 a=MKtGQD3n3ToA:10 a=1oJP67jkp3AA:10 a=GEAsPZ9sns4A:10 a=Dcc36XvVcqTwjGBsaSEA:9 From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Thu, 18 Aug 2022 00:32:57 +0200 Message-Id: <20220817223257.16486-1-michael@niedermayer.cc> X-Mailer: git-send-email 2.17.1 X-CMAE-Envelope: MS4wfKB2x+Se2/DMBEZQMQjn9zGHVPM/bsv1km0TpsaguqdeSScwVnj8Chhbi/1sr/UwLOl3IrOESDqGOqCgaK43HZo+zOvEGDYNsLxm7YzIPwUS6kJKhj+f 7lsvH3MaHrTA4FK3x06YVKprzeb5wOVAzEzHbS/utTYYUVNJj3/3JUJz4HfBAVnl5+rNEmxq0475vQ== Subject: [FFmpeg-devel] [PATCH] avformat/avidec: Prevent entity expansion attacks X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 7fUKeZo3mhCy Fixes: Timeout Fixes no testcase, this is the same idea as similar attacks against XML parsers Signed-off-by: Michael Niedermayer --- libavformat/avidec.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 937d9e6ffb..910a4e8792 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -82,6 +82,8 @@ typedef struct AVIContext { int stream_index; DVDemuxContext *dv_demux; int odml_depth; + int64_t odml_read; + int64_t odml_max_pos; int use_odml; #define MAX_ODML_DEPTH 1000 int64_t dts_max; @@ -200,7 +202,7 @@ static int read_odml_index(AVFormatContext *s, int64_t frame_num) st = s->streams[stream_id]; ast = st->priv_data; - if (index_sub_type) + if (index_sub_type || entries_in_use < 0) return AVERROR_INVALIDDATA; avio_rl32(pb); @@ -221,11 +223,18 @@ static int read_odml_index(AVFormatContext *s, int64_t frame_num) } for (i = 0; i < entries_in_use; i++) { + avi->odml_max_pos = FFMAX(avi->odml_max_pos, avio_tell(pb)); + + // If we read more than there are bytes then we must have been reading something twice + if (avi->odml_read > avi->odml_max_pos) + return AVERROR_INVALIDDATA; + if (index_type) { int64_t pos = avio_rl32(pb) + base - 8; int len = avio_rl32(pb); int key = len >= 0; len &= 0x7FFFFFFF; + avi->odml_read += 8; av_log(s, AV_LOG_TRACE, "pos:%"PRId64", len:%X\n", pos, len); @@ -244,6 +253,7 @@ static int read_odml_index(AVFormatContext *s, int64_t frame_num) int64_t offset, pos; int duration; int ret; + avi->odml_read += 16; offset = avio_rl64(pb); avio_rl32(pb); /* size */