aboutsummaryrefslogtreecommitdiff
blob: df04355c972d19091408495faea477259df48304 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
org-mode should not expand link abbrevs that specify an unsafe function
Backported from emacs-29 branch

commit c645e1d8205f0f0663ec4a2d27575b238c646c7c
Author: Ihor Radchenko <yantar92@posteo.net>
Date:   Fri Jun 21 15:45:25 2024 +0200

    org-link-expand-abbrev: Do not evaluate arbitrary unsafe Elisp code

--- emacs-28.2/lisp/org/ol.el
+++ emacs-28.2/lisp/org/ol.el
@@ -1020,17 +1020,35 @@
       (if (not as)
 	  link
 	(setq rpl (cdr as))
-	(cond
-	 ((symbolp rpl) (funcall rpl tag))
-	 ((string-match "%(\\([^)]+\\))" rpl)
-	  (replace-match
-	   (save-match-data
-	     (funcall (intern-soft (match-string 1 rpl)) tag))
-	   t t rpl))
-	 ((string-match "%s" rpl) (replace-match (or tag "") t t rpl))
-	 ((string-match "%h" rpl)
-	  (replace-match (url-hexify-string (or tag "")) t t rpl))
-	 (t (concat rpl tag)))))))
+	;; Drop any potentially dangerous text properties like
+	;; `modification-hooks' that may be used as an attack vector.
+	(substring-no-properties
+	 (cond
+	  ((symbolp rpl) (funcall rpl tag))
+	  ((string-match "%(\\([^)]+\\))" rpl)
+	   (let ((rpl-fun-symbol (intern-soft (match-string 1 rpl))))
+	     ;; Using `unsafep-function' is not quite enough because
+	     ;; Emacs considers functions like `genenv' safe, while
+	     ;; they can potentially be used to expose private system
+	     ;; data to attacker if abbreviated link is clicked.
+	     (if (or (eq t (get rpl-fun-symbol 'org-link-abbrev-safe))
+		     (eq t (get rpl-fun-symbol 'pure)))
+		 (replace-match
+		  (save-match-data
+		    (funcall (intern-soft (match-string 1 rpl)) tag))
+		  t t rpl)
+	       (org-display-warning
+		(format "Disabling unsafe link abbrev: %s
+You may mark function safe via (put '%s 'org-link-abbrev-safe t)"
+			rpl (match-string 1 rpl)))
+	       (setq org-link-abbrev-alist-local (delete as org-link-abbrev-alist-local)
+		     org-link-abbrev-alist (delete as org-link-abbrev-alist))
+	       link
+	       )))
+	  ((string-match "%s" rpl) (replace-match (or tag "") t t rpl))
+	  ((string-match "%h" rpl)
+	   (replace-match (url-hexify-string (or tag "")) t t rpl))
+	  (t (concat rpl tag))))))))
 
 (defun org-link-open (link &optional arg)
   "Open a link object LINK.