Add CVE-2018-20762.patch
authorReinhard Tartler <siretart@tauware.de>
Fri, 15 Feb 2019 11:32:46 +0000 (06:32 -0500)
committerReinhard Tartler <siretart@tauware.de>
Fri, 15 Feb 2019 11:32:46 +0000 (06:32 -0500)
debian/patches/CVE-2018-20762.patch [new file with mode: 0644]
debian/patches/CVE-2018-7752.patch
debian/patches/series

diff --git a/debian/patches/CVE-2018-20762.patch b/debian/patches/CVE-2018-20762.patch
new file mode 100644 (file)
index 0000000..c2c9ab1
--- /dev/null
@@ -0,0 +1,178 @@
+commit 35ab4475a7df9b2a4bcab235e379c0c3ec543658
+Author: Aurelien David <aurelien.david@telecom-paristech.fr>
+Date:   Fri Jan 11 11:32:54 2019 +0100
+Description: CVE-2018-20762
+
+    fix some overflows due to strcpy
+    
+    fixes #1184, #1186, #1187 among other things
+
+--- a/applications/mp4box/fileimport.c
++++ b/applications/mp4box/fileimport.c
+@@ -2247,17 +2247,33 @@ GF_Err cat_multiple_files(GF_ISOFile *de
+       cat_enum.align_timelines = align_timelines;
+       cat_enum.allow_add_in_command = allow_add_in_command;
++      if (strlen(fileName) >= sizeof(cat_enum.szPath)) {
++              GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("File name %s is too long.\n", fileName));
++              return GF_NOT_SUPPORTED;
++      }
+       strcpy(cat_enum.szPath, fileName);
+       sep = strrchr(cat_enum.szPath, GF_PATH_SEPARATOR);
+       if (!sep) sep = strrchr(cat_enum.szPath, '/');
+       if (!sep) {
+               strcpy(cat_enum.szPath, ".");
++              if (strlen(fileName) >= sizeof(cat_enum.szRad1)) {
++                      GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("File name %s is too long.\n", fileName));
++                      return GF_NOT_SUPPORTED;
++              }
+               strcpy(cat_enum.szRad1, fileName);
+       } else {
++              if (strlen(sep + 1) >= sizeof(cat_enum.szRad1)) {
++                      GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("File name %s is too long.\n", (sep + 1)));
++                      return GF_NOT_SUPPORTED;
++              }
+               strcpy(cat_enum.szRad1, sep+1);
+               sep[0] = 0;
+       }
+       sep = strchr(cat_enum.szRad1, '*');
++      if (strlen(sep + 1) >= sizeof(cat_enum.szRad2)) {
++              GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("File name %s is too long.\n", (sep + 1)));
++              return GF_NOT_SUPPORTED;
++      }
+       strcpy(cat_enum.szRad2, sep+1);
+       sep[0] = 0;
+       sep = strchr(cat_enum.szRad2, '%');
+@@ -2265,6 +2281,10 @@ GF_Err cat_multiple_files(GF_ISOFile *de
+       if (!sep) sep = strchr(cat_enum.szRad2, ':');
+       strcpy(cat_enum.szOpt, "");
+       if (sep) {
++              if (strlen(sep) >= sizeof(cat_enum.szOpt)) {
++                      GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("Invalid option: %s.\n", sep));
++                      return GF_NOT_SUPPORTED;
++              }
+               strcpy(cat_enum.szOpt, sep);
+               sep[0] = 0;
+       }
+--- a/applications/mp4client/main.c
++++ b/applications/mp4client/main.c
+@@ -900,7 +900,8 @@ Bool GPAC_EventProc(void *ptr, GF_Event
+               break;
+       case GF_EVENT_NAVIGATE:
+               if (gf_term_is_supported_url(term, evt->navigate.to_url, 1, no_mime_check)) {
+-                      strcpy(the_url, evt->navigate.to_url);
++                      strncpy(the_url, evt->navigate.to_url, sizeof(the_url)-1);
++                      the_url[sizeof(the_url) - 1] = 0;
+                       fprintf(stderr, "Navigating to URL %s\n", the_url);
+                       gf_term_navigate_to(term, evt->navigate.to_url);
+                       return 1;
+@@ -1089,6 +1090,11 @@ void set_cfg_option(char *opt_string)
+       }
+       {
+               const size_t sepIdx = sep - opt_string;
++              if (sepIdx >= sizeof(szSec)) {
++                      fprintf(stderr, "Badly formatted option %s - Section name is too long\n", opt_string);
++                      return;
++              }
++
+               strncpy(szSec, opt_string, sepIdx);
+               szSec[sepIdx] = 0;
+       }
+@@ -1100,8 +1106,16 @@ void set_cfg_option(char *opt_string)
+       }
+       {
+               const size_t sepIdx = sep2 - sep;
++              if (sepIdx >= sizeof(szKey)) {
++                      fprintf(stderr, "Badly formatted option %s - key name is too long\n", opt_string);
++                      return;
++              }
+               strncpy(szKey, sep, sepIdx);
+               szKey[sepIdx] = 0;
++              if (strlen(sep2 + 1) >= sizeof(szVal)) {
++                      fprintf(stderr, "Badly formatted option %s - value is too long\n", opt_string);
++                      return;
++              }
+               strcpy(szVal, sep2+1);
+       }
+@@ -1656,7 +1670,14 @@ int mp4client_main(int argc, char **argv
+       else if (!gui_mode && url_arg) {
+               char *ext;
+-              strcpy(the_url, url_arg);
++              if (strlen(url_arg) >= sizeof(the_url)) {
++                      fprintf(stderr, "Input url %s is too long, truncating to %d chars.\n", url_arg, (int)(sizeof(the_url) - 1));
++                      strncpy(the_url, url_arg, sizeof(the_url)-1);
++                      the_url[sizeof(the_url) - 1] = 0;
++              }
++              else {
++                      strcpy(the_url, url_arg);
++              }
+               ext = strrchr(the_url, '.');
+               if (ext && (!stricmp(ext, ".m3u") || !stricmp(ext, ".pls"))) {
+                       GF_Err e = GF_OK;
+@@ -1668,7 +1689,10 @@ int mp4client_main(int argc, char **argv
+                               GF_DownloadSession *sess = gf_dm_sess_new(term->downloader, the_url, GF_NETIO_SESSION_NOT_THREADED, NULL, NULL, &e);
+                               if (sess) {
+                                       e = gf_dm_sess_process(sess);
+-                                      if (!e) strcpy(the_url, gf_dm_sess_get_cache_name(sess));
++                                      if (!e) {
++                                              strncpy(the_url, gf_dm_sess_get_cache_name(sess), sizeof(the_url) - 1);
++                                              the_url[sizeof(the_cfg) - 1] = 0;
++                                      }
+                                       gf_dm_sess_del(sess);
+                               }
+                       }
+@@ -1691,7 +1715,8 @@ int mp4client_main(int argc, char **argv
+               fprintf(stderr, "Hit 'h' for help\n\n");
+               str = gf_cfg_get_key(cfg_file, "General", "StartupFile");
+               if (str) {
+-                      strcpy(the_url, "MP4Client "GPAC_FULL_VERSION);
++                      strncpy(the_url, "MP4Client "GPAC_FULL_VERSION , sizeof(the_url)-1);
++                      the_url[sizeof(the_url) - 1] = 0;
+                       gf_term_connect(term, str);
+                       startup_file = 1;
+                       is_connected = 1;
+--- a/modules/ffmpeg_in/ffmpeg_demux.c
++++ b/modules/ffmpeg_in/ffmpeg_demux.c
+@@ -227,7 +227,7 @@ static Bool FFD_CanHandleURL(GF_InputSer
+       AVFormatContext *ctx;
+       AVOutputFormat *fmt_out;
+       Bool ret = GF_FALSE;
+-      char *ext, szName[1000], szExt[20];
++      char *ext, szName[1024], szExt[20];
+       const char *szExtList;
+       FFDemux *ffd;
+       if (!plug || !url)
+@@ -243,6 +243,9 @@ static Bool FFD_CanHandleURL(GF_InputSer
+       ffd = (FFDemux*)plug->priv;
++      if (strlen(url) >= sizeof(szName))
++              return GF_FALSE;
++
+       strcpy(szName, url);
+       ext = strrchr(szName, '#');
+       if (ext) ext[0] = 0;
+@@ -252,7 +255,7 @@ static Bool FFD_CanHandleURL(GF_InputSer
+       ext = strrchr(szName, '.');
+       if (ext && strlen(ext) > 19) ext = NULL;
+-      if (ext && strlen(ext) > 1) {
++      if (ext && strlen(ext) > 1 && strlen(ext) <= sizeof(szExt)) {
+               strcpy(szExt, &ext[1]);
+               strlwr(szExt);
+ #ifndef FFMPEG_DEMUX_ENABLE_MPEG2TS
+--- a/src/scene_manager/scene_manager.c
++++ b/src/scene_manager/scene_manager.c
+@@ -646,6 +646,10 @@ GF_Err gf_sm_load_init(GF_SceneLoader *l
+                               ext[0] = '.';
+                               ext = anext;
+                       }
++                      if (strlen(ext) < 2 || strlen(ext) > sizeof(szExt)) {
++                              GF_LOG(GF_LOG_ERROR, GF_LOG_SCENE, ("[Scene Manager] invalid extension in file name %s\n", load->fileName));
++                              return GF_NOT_SUPPORTED;
++                      }
+                       strcpy(szExt, &ext[1]);
+                       strlwr(szExt);
+                       if (strstr(szExt, "bt")) load->type = GF_SM_LOAD_BT;
index 846dadb97eb6435112fea67e37c16af46c667243..bcfe8ab08bda3f34c8f5905ebba35a9b128d2ed1 100644 (file)
@@ -5,11 +5,9 @@ Upstream: commit 90dc7f853d31b0a4e9441cba97feccf36d8b69a4
 
 fix some exploitable overflows (#994, #997)
 
-diff --git a/include/gpac/tools.h b/include/gpac/tools.h
-index dbc3cebf3..15483d7d6 100644
 --- a/include/gpac/tools.h
 +++ b/include/gpac/tools.h
-@@ -1067,6 +1067,7 @@ void gf_fm_request_call(u32 type, u32 param, int *value);
+@@ -1067,6 +1067,7 @@ void gf_fm_request_call(u32 type, u32 pa
  
  /* \endcond */
  
@@ -17,11 +15,9 @@ index dbc3cebf3..15483d7d6 100644
  
  #ifdef __cplusplus
  }
-diff --git a/src/isomedia/avc_ext.c b/src/isomedia/avc_ext.c
-index c1096f872..c59f2ce97 100644
 --- a/src/isomedia/avc_ext.c
 +++ b/src/isomedia/avc_ext.c
-@@ -2413,6 +2413,8 @@ GF_Err gf_isom_oinf_read_entry(void *entry, GF_BitStream *bs)
+@@ -2361,6 +2361,8 @@ GF_Err gf_isom_oinf_read_entry(void *ent
                op->output_layer_set_idx = gf_bs_read_u16(bs);
                op->max_temporal_id = gf_bs_read_u8(bs);
                op->layer_count = gf_bs_read_u8(bs);
@@ -30,11 +26,9 @@ index c1096f872..c59f2ce97 100644
                for (j = 0; j < op->layer_count; j++) {
                        op->layers_info[j].ptl_idx = gf_bs_read_u8(bs);
                        op->layers_info[j].layer_id = gf_bs_read_int(bs, 6);
-diff --git a/src/media_tools/av_parsers.c b/src/media_tools/av_parsers.c
-index b9b5acdbb..27a6807d9 100644
 --- a/src/media_tools/av_parsers.c
 +++ b/src/media_tools/av_parsers.c
-@@ -2385,6 +2385,10 @@ s32 gf_media_avc_read_sps(const char *sps_data, u32 sps_size, AVCState *avc, u32
+@@ -2386,6 +2386,10 @@ s32 gf_media_avc_read_sps(const char *sp
                sps->offset_for_non_ref_pic = bs_get_se(bs);
                sps->offset_for_top_to_bottom_field = bs_get_se(bs);
                sps->poc_cycle_length = bs_get_ue(bs);
index 82ab5cf3f4256e9580fbbb9a459493a818d9bd2c..5dadc4b5cbcf9ba82260ec989d778f9ca53e56ac 100644 (file)
@@ -7,4 +7,5 @@ dont-err-build-on-uknown-system.patch
 ffmpeg_4.patch
 fix_makefile_install.patch
 CVE-2018-7752.patch
+CVE-2018-20762.patch
 CVE-2018-20763.patch