diff --git a/SOURCES/CVE-2020-27783.patch b/SOURCES/CVE-2020-27783.patch
new file mode 100644
index 0000000..5d7baaf
--- /dev/null
+++ b/SOURCES/CVE-2020-27783.patch
@@ -0,0 +1,121 @@
+diff --git a/src/lxml/html/clean.py b/src/lxml/html/clean.py
+index adc3f45..6f3f7de 100644
+--- a/src/lxml/html/clean.py
++++ b/src/lxml/html/clean.py
+@@ -61,12 +61,15 @@ __all__ = ['clean_html', 'clean', 'Cleaner', 'autolink', 'autolink_html',
+
+ # This is an IE-specific construct you can have in a stylesheet to
+ # run some Javascript:
+-_css_javascript_re = re.compile(
+- r'expression\s*\(.*?\)', re.S|re.I)
++_replace_css_javascript = re.compile(
++ r'expression\s*\(.*?\)', re.S|re.I).sub
+
+ # Do I have to worry about @\nimport?
+-_css_import_re = re.compile(
+- r'@\s*import', re.I)
++_replace_css_import = re.compile(
++ r'@\s*import', re.I).sub
++
++_looks_like_tag_content = re.compile(
++ r'?[a-zA-Z]+|\son[a-zA-Z]+\s*=', re.ASCII).search
+
+ # All kinds of schemes besides just javascript: that can cause
+ # execution:
+@@ -292,8 +295,8 @@ class Cleaner(object):
+ if not self.inline_style:
+ for el in _find_styled_elements(doc):
+ old = el.get('style')
+- new = _css_javascript_re.sub('', old)
+- new = _css_import_re.sub('', new)
++ new = _replace_css_javascript('', old)
++ new = _replace_css_import('', new)
+ if self._has_sneaky_javascript(new):
+ # Something tricky is going on...
+ del el.attrib['style']
+@@ -305,9 +308,9 @@ class Cleaner(object):
+ el.drop_tree()
+ continue
+ old = el.text or ''
+- new = _css_javascript_re.sub('', old)
++ new = _replace_css_javascript('', old)
+ # The imported CSS can do anything; we just can't allow:
+- new = _css_import_re.sub('', old)
++ new = _replace_css_import('', new)
+ if self._has_sneaky_javascript(new):
+ # Something tricky is going on...
+ el.text = '/* deleted */'
+@@ -509,6 +512,12 @@ class Cleaner(object):
+ return True
+ if 'expression(' in style:
+ return True
++ if ''
++ return True
+ return False
+
+ def clean_html(self, html):
+diff --git a/src/lxml/html/tests/test_clean.py b/src/lxml/html/tests/test_clean.py
+index 3bcaaf5..451eec2 100644
+--- a/src/lxml/html/tests/test_clean.py
++++ b/src/lxml/html/tests/test_clean.py
+@@ -69,6 +69,26 @@ class CleanerTest(unittest.TestCase):
+ s = lxml.html.fromstring('child')
+ self.assertEqual('child', clean_html(s).text_content())
+
++ def test_sneaky_noscript_in_style(self):
++ # This gets parsed as through into the output.
++ html = '',
++ lxml.html.tostring(clean_html(s)))
++
++ def test_sneaky_js_in_math_style(self):
++ # This gets parsed as