Compare commits

...
4 Commits
Author SHA1 Message Date
Kevin Mitchell 0d893bebdc Release 0.27.1 2018-02-10 04:45:10 -08:00
Ricardo Constantino 011b9dc46a ytdl_hook: fix safe url checking with EDL urls 2018-02-10 04:45:10 -08:00
Ricardo Constantino 83299b8382 ytdl_hook: move url_is_safe earlier in code
lua isn't javascript.
2018-02-10 04:45:09 -08:00
Ricardo Constantino 899ce94693 ytdl_hook: whitelist protocols from urls retrieved from youtube-dl
Not very clean since there's a lot of potential unsafe urls that youtube-dl
can give us, depending on whether it's a single url, split tracks,
playlists, segmented dash, etc.
2018-02-10 04:45:03 -08:00
3 changed files with 55 additions and 5 deletions

No files matched your search

+9
View File
@@ -1,3 +1,12 @@
Release 0.27.1
==============
This releaes fixes CVE-2018-6360.
Fixes and Minor Enhancements
----------------------------
- ytdl_hook: whitelist protocols from urls retrieved from youtube-dl (#5456)
Release 0.27.0
==============
+1 -1
View File
@@ -1 +1 @@
0.27.0
0.27.1
+45 -4
View File
@@ -15,6 +15,18 @@ local ytdl = {
local chapter_list = {}
function Set (t)
local set = {}
for _, v in pairs(t) do set[v] = true end
return set
end
local safe_protos = Set {
"http", "https", "ftp", "ftps",
"rtmp", "rtmps", "rtmpe", "rtmpt", "rtmpts", "rtmpte",
"data"
}
local function exec(args)
local ret = utils.subprocess({args = args})
return ret.status, ret.stdout, ret
@@ -71,6 +83,15 @@ local function edl_escape(url)
return "%" .. string.len(url) .. "%" .. url
end
local function url_is_safe(url)
local proto = type(url) == "string" and url:match("^(.+)://") or nil
local safe = proto and safe_protos[proto]
if not safe then
msg.error(("Ignoring potentially unsafe url: '%s'"):format(url))
end
return safe
end
local function time_to_secs(time_string)
local ret
@@ -182,6 +203,9 @@ local function edl_track_joined(fragments, protocol, is_live, base)
for i = offset, #fragments do
local fragment = fragments[i]
if not url_is_safe(join_url(base, fragment)) then
return nil
end
table.insert(parts, edl_escape(join_url(base, fragment)))
if fragment.duration then
parts[#parts] =
@@ -201,6 +225,9 @@ local function add_single_video(json)
edl_track = edl_track_joined(track.fragments,
track.protocol, json.is_live,
track.fragment_base_url)
if not edl_track and not url_is_safe(track.url) then
return
end
if track.acodec and track.acodec ~= "none" then
-- audio track
mp.commandv("audio-add",
@@ -217,6 +244,9 @@ local function add_single_video(json)
edl_track = edl_track_joined(json.fragments, json.protocol,
json.is_live, json.fragment_base_url)
if not edl_track and not url_is_safe(json.url) then
return
end
-- normal video or single track
streamurl = edl_track or json.url
set_http_headers(json.http_headers)
@@ -408,6 +438,10 @@ mp.add_hook("on_load", 10, function ()
msg.debug("EDL: " .. playlist)
if not playlist then
return
end
-- can't change the http headers for each entry, so use the 1st
if json.entries[1] then
set_http_headers(json.entries[1].http_headers)
@@ -455,14 +489,14 @@ mp.add_hook("on_load", 10, function ()
add_single_video(json.entries[1])
else
local playlist = "#EXTM3U\n"
local playlist = {"#EXTM3U"}
for i, entry in pairs(json.entries) do
local site = entry.url
local title = entry.title
if not (title == nil) then
title = string.gsub(title, '%s+', ' ')
playlist = playlist .. "#EXTINF:0," .. title .. "\n"
table.insert(playlist, "#EXTINF:0," .. title)
end
-- some extractors will still return the full info for
@@ -475,10 +509,17 @@ mp.add_hook("on_load", 10, function ()
site = entry["webpage_url"]
end
playlist = playlist .. "ytdl://" .. site .. "\n"
-- links with only youtube id as returned by --flat-playlist
if not site:find("://") then
table.insert(playlist, "ytdl://" .. site)
elseif url_is_safe(site) then
table.insert(playlist, site)
end
end
mp.set_property("stream-open-filename", "memory://" .. playlist)
if #playlist > 0 then
mp.set_property("stream-open-filename", "memory://" .. table.concat(playlist, "\n"))
end
end
else -- probably a video