* [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable @ 2022-12-10 20:28 Tom Gillespie 2022-12-11 2:58 ` Max Nikulin 0 siblings, 1 reply; 49+ messages in thread From: Tom Gillespie @ 2022-12-10 20:28 UTC (permalink / raw) To: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 198 bytes --] Hi, Here is a patch that improves the ergonomics and thus hopefully the security for the recent changes to check evaluation for cells. Full details in the commit message on the patch. Best! Tom [-- Attachment #2: 0001-ob-core-add-org-confirm-babel-evaluate-cell-custom-v.patch --] [-- Type: text/x-patch, Size: 3199 bytes --] From da3a88e2919ec5bac6328d55eb99b3352f25b9b4 Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Sat, 10 Dec 2022 12:11:17 -0800 Subject: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable * lisp/ob-core.el (org-confirm-babel-evaluate-cell): Added to control execution of cells separate from execution of src blocks, it works in exactly the same way as org-confirm-babel-evaluate. * lisp/ob-core.el (org-babel-read): org-confirm-babel-evaluate-cell is now used to check cells independent of org-confirm-babel-evaluate. Following the change in 10e857d42859a55b23cd4206ffce3ebd0f678583 it became extremely annoying to tangle files that make extensive use of elisp expression in src block #+header: statements. This commit resolves the issue by making it possible to ignore checks on cells (the old behavior) without compromising general security for running src blocks. This is necessary because there is no easy way to hop swap org-confirm-babel-evaluate between org-get-src-block-info where org-babel-read is called and the execution of that src block. It could probably be done using advice around org-babel-read, but that is a level of hackery that should be avoided. --- lisp/ob-core.el | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 62b0d3612..14669d940 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -128,6 +128,14 @@ remove code block execution from the `\\[org-ctrl-c-ctrl-c]' keybinding." ;; don't allow this variable to be changed through file settings (put 'org-confirm-babel-evaluate 'safe-local-variable (lambda (x) (eq x t))) +(defcustom org-confirm-babel-evaluate-cell t + "Confirm before evaluating a cell." + :group 'org-babel + :version "29.1" + :type '(choice boolean function)) +;; don't allow this variable to be changed through file settings +(put 'org-confirm-babel-evaluate-cell 'safe-local-variable (lambda (x) (eq x t))) + (defcustom org-babel-no-eval-on-ctrl-c-ctrl-c nil "\\<org-mode-map>\ Remove code block evaluation from the `\\[org-ctrl-c-ctrl-c]' key binding." @@ -3180,11 +3188,14 @@ situations in which is it not appropriate." (string= cell "*this*"))) ;; Prevent arbitrary function calls. (if (and (memq (string-to-char cell) '(?\( ?`)) + (if (functionp org-confirm-babel-evaluate-cell) + (funcall org-confirm-babel-evaluate-cell cell) + org-confirm-babel-evaluate-cell) (not (org-babel-confirm-evaluate - ;; See `org-babel-get-src-block-info'. - (list "emacs-lisp" (format "%S" cell) - '((:eval . yes)) nil (format "%S" cell) - nil nil)))) + ;; See `org-babel-get-src-block-info'. + (list "emacs-lisp" (format "%S" cell) + '((:eval . yes)) nil (format "%S" cell) + nil nil)))) ;; Not allowed. (user-error "Evaluation of elisp code %S aborted." cell) (eval (read cell) t))) -- 2.37.4 ^ permalink raw reply related [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-10 20:28 [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable Tom Gillespie @ 2022-12-11 2:58 ` Max Nikulin 2022-12-11 20:27 ` Tom Gillespie 0 siblings, 1 reply; 49+ messages in thread From: Max Nikulin @ 2022-12-11 2:58 UTC (permalink / raw) To: emacs-orgmode On 11/12/2022 03:28, Tom Gillespie wrote: > Here is a patch that improves the ergonomics and thus hopefully > the security for the recent changes to check evaluation for cells. Tom, thank you for the patch. Frankly speaking, I was expecting this kind of complains, but I could not suggest any solution. I am not familiar with org-babel code, so my comments may be false alarms. > * lisp/ob-core.el (org-confirm-babel-evaluate-cell): Added to control > execution of cells separate from execution of src blocks, it works in > exactly the same way as org-confirm-babel-evaluate. I am not sure concerning "exactly". lisp/ob-core.el:248 `org-confirm-babel-evaluate' is called with 2 arguments. In your patch `org-confirm-babel-evaluate-cell' has a single argument. > This commit resolves the issue by making it possible to ignore checks > on cells (the old behavior) without compromising general security for > running src blocks. It seems, you do not change defaults. Could you, please, provide an example of configuration that is less annoying, but still safe? > This is necessary because there is no easy way to hop swap > org-confirm-babel-evaluate between org-get-src-block-info where > org-babel-read is called and the execution of that src block. It could > probably be done using advice around org-babel-read, but that is a > level of hackery that should be avoided. I was thinking if it is possible to collect requests to confirm and to allow the user to decide for the whole bunch of expressions and code blocks. Besides implementation issues, there is a question concerning UI that will allow to inspect code to be evaluated. > diff --git a/lisp/ob-core.el b/lisp/ob-core.el ...> +(defcustom org-confirm-babel-evaluate-cell t > + "Confirm before evaluating a cell." Calling convention for the case of function value is not described. If it is really the same as for `org-confirm-babel-evaluate' then this user option should be mentioned in the docstring. > + :group 'org-babel > + :version "29.1" :package-version instead of :version? > + :type '(choice boolean function)) > +;; don't allow this variable to be changed through file settings > +(put 'org-confirm-babel-evaluate-cell 'safe-local-variable (lambda (x) (eq x t))) Is there any reason to not use the :safe property of `defcustom'? I see that you take definition of `org-confirm-babel-evaluate' as a template so I wonder if there is some particular reason or the original code was just written before introducing of :safe. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-11 2:58 ` Max Nikulin @ 2022-12-11 20:27 ` Tom Gillespie 2022-12-11 20:37 ` Tom Gillespie ` (2 more replies) 0 siblings, 3 replies; 49+ messages in thread From: Tom Gillespie @ 2022-12-11 20:27 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Hi Max, Thank you for the feedback. More replies in lines. Best! Tom > I am not sure concerning "exactly". > > lisp/ob-core.el:248 > `org-confirm-babel-evaluate' is called with 2 arguments. In your patch > `org-confirm-babel-evaluate-cell' has a single argument. You're right, and in point of fact I should have retained the structure exactly because in other contexts I have thought about ways to use other languages in contexts like that. At the moment everything is elisp so I dropped the argument, but that is clearly a mistake. > It seems, you do not change defaults. Could you, please, provide an > example of configuration that is less annoying, but still safe? #+begin_src elisp :results none (setq-local org-confirm-babel-evaluate-cell (lambda (lang body) (ignore lang) (let ((rb (read body))) (not ; aka (unless condition t) (or (member rb '((or) (and) ;; add more forms that are known safe here )) (and (eq (car rb) 'identity) (let ((v (cadr rb))) (or (symbolp v) (stringp v) (numberp v) )))))))) #+end_src #+header: :var v1=(or) v2=(and) v3=(identity nil) #+header: :var v4=(identity default-directory) v5=(identity #o0755) #+header: :var v6=(identity "not sure why you would want to do this") #+header: :var v7=(identity (concat "this" "will" "fail")) #+header: :var v8="reminder that strings are ok" #+begin_src elisp (mapcar #'list (list v1 v2 v3 v4 v5 v6 v7 v8)) #+end_src > I was thinking if it is possible to collect requests to confirm and to > allow the user to decide for the whole bunch of expressions and code > blocks. Besides implementation issues, there is a question concerning UI > that will allow to inspect code to be evaluated. Yes, in the example above I thought about including something with a yes-or-no-p where users could quickly add forms to a safe list some (defcustom org-known-safe-cells '()) or something like that. A user could do that with the new machinery, and we could do the same for the default implementation. I think that is the next step once we get the basics in place. > Calling convention for the case of function value is not described. If > it is really the same as for `org-confirm-babel-evaluate' then this user > option should be mentioned in the docstring. When I correct the function signature to actually match I will make a note in the docstring. > :package-version instead of :version? I think because org is part of emacs core we use the emacs version? I see "24.1" included with other org defcustoms. > Is there any reason to not use the :safe property of `defcustom'? I see > that you take definition of `org-confirm-babel-evaluate' as a template > so I wonder if there is some particular reason or the original code was > just written before introducing of :safe. I'm guessing that it was written before :safe, but don't know for sure. A systematic cleanup of stuff like that could come after this maybe? ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-11 20:27 ` Tom Gillespie @ 2022-12-11 20:37 ` Tom Gillespie 2022-12-11 20:46 ` Kyle Meyer 2022-12-13 16:15 ` Max Nikulin 2 siblings, 0 replies; 49+ messages in thread From: Tom Gillespie @ 2022-12-11 20:37 UTC (permalink / raw) To: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 314 bytes --] Here is an updated version of the patch with the convention corrected and the docstring updated for clarity. It would be great to try to get this into any 9.6 patches before the 29 release, but I'm not sure if that is possible. If it is missing we are likely to get a lot of messages from unhappy users. Best! Tom [-- Attachment #2: 0001-ob-core-add-org-confirm-babel-evaluate-cell-custom-v.patch --] [-- Type: text/x-patch, Size: 3281 bytes --] From 54e468b60f17b54d81edafd8ee9e22311e519793 Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Sat, 10 Dec 2022 12:11:17 -0800 Subject: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable * lisp/ob-core.el (org-confirm-babel-evaluate-cell): Added to control execution of cells separate from execution of src blocks, it works in exactly the same way as org-confirm-babel-evaluate. * lisp/ob-core.el (org-babel-read): org-confirm-babel-evaluate-cell is now used to check cells independent of org-confirm-babel-evaluate. Following the change in 10e857d42859a55b23cd4206ffce3ebd0f678583 it became extremely annoying to tangle files that make extensive use of elisp expression in src block #+header: statements. This commit resolves the issue by making it possible to ignore checks on cells (the old behavior) without compromising general security for running src blocks. This is necessary because there is no easy way to hop swap org-confirm-babel-evaluate between org-get-src-block-info where org-babel-read is called and the execution of that src block. It could probably be done using advice around org-babel-read, but that is a level of hackery that should be avoided. --- lisp/ob-core.el | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 62b0d3612..60dabab0a 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -128,6 +128,15 @@ remove code block execution from the `\\[org-ctrl-c-ctrl-c]' keybinding." ;; don't allow this variable to be changed through file settings (put 'org-confirm-babel-evaluate 'safe-local-variable (lambda (x) (eq x t))) +(defcustom org-confirm-babel-evaluate-cell t + "Confirm before evaluating a cell. +This follows the same conventions as `org-confirm-babel-evaluate'." + :group 'org-babel + :version "29.1" + :type '(choice boolean function)) +;; don't allow this variable to be changed through file settings +(put 'org-confirm-babel-evaluate-cell 'safe-local-variable (lambda (x) (eq x t))) + (defcustom org-babel-no-eval-on-ctrl-c-ctrl-c nil "\\<org-mode-map>\ Remove code block evaluation from the `\\[org-ctrl-c-ctrl-c]' key binding." @@ -3180,11 +3189,14 @@ situations in which is it not appropriate." (string= cell "*this*"))) ;; Prevent arbitrary function calls. (if (and (memq (string-to-char cell) '(?\( ?`)) + (if (functionp org-confirm-babel-evaluate-cell) + (funcall org-confirm-babel-evaluate-cell "emacs-lisp" cell) + org-confirm-babel-evaluate-cell) (not (org-babel-confirm-evaluate - ;; See `org-babel-get-src-block-info'. - (list "emacs-lisp" (format "%S" cell) - '((:eval . yes)) nil (format "%S" cell) - nil nil)))) + ;; See `org-babel-get-src-block-info'. + (list "emacs-lisp" (format "%S" cell) + '((:eval . yes)) nil (format "%S" cell) + nil nil)))) ;; Not allowed. (user-error "Evaluation of elisp code %S aborted." cell) (eval (read cell) t))) -- 2.37.4 ^ permalink raw reply related [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-11 20:27 ` Tom Gillespie 2022-12-11 20:37 ` Tom Gillespie @ 2022-12-11 20:46 ` Kyle Meyer 2022-12-11 21:08 ` Tom Gillespie 2022-12-13 16:15 ` Max Nikulin 2 siblings, 1 reply; 49+ messages in thread From: Kyle Meyer @ 2022-12-11 20:46 UTC (permalink / raw) To: Tom Gillespie; +Cc: Max Nikulin, emacs-orgmode Tom Gillespie writes: [...] >> :package-version instead of :version? > > I think because org is part of emacs core we use the emacs version? Please use :package-version and let the mapping be handled by customize-package-emacs-version-alist. > I see "24.1" included with other org defcustoms. There has a been a good amount of clean up to remove :version and use :package-version, but, yes, there are still :version instances. Things look good for the last Org release, though: $ git grep '29\.1' lisp/org.el: ("9.6" . "29.1"))) ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-11 20:46 ` Kyle Meyer @ 2022-12-11 21:08 ` Tom Gillespie 2022-12-12 10:20 ` Ihor Radchenko 0 siblings, 1 reply; 49+ messages in thread From: Tom Gillespie @ 2022-12-11 21:08 UTC (permalink / raw) To: Kyle Meyer; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 170 bytes --] > Please use :package-version and let the mapping be handled by > customize-package-emacs-version-alist. Got it. Here's the updated patch (I think I did it correctly?). [-- Attachment #2: 0001-ob-core-add-org-confirm-babel-evaluate-cell-custom-v.patch --] [-- Type: text/x-patch, Size: 3297 bytes --] From 47a47aa9453a54a4f5f2e9188e2ad072a77c50cb Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Sat, 10 Dec 2022 12:11:17 -0800 Subject: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable * lisp/ob-core.el (org-confirm-babel-evaluate-cell): Added to control execution of cells separate from execution of src blocks, it works in exactly the same way as org-confirm-babel-evaluate. * lisp/ob-core.el (org-babel-read): org-confirm-babel-evaluate-cell is now used to check cells independent of org-confirm-babel-evaluate. Following the change in 10e857d42859a55b23cd4206ffce3ebd0f678583 it became extremely annoying to tangle files that make extensive use of elisp expression in src block #+header: statements. This commit resolves the issue by making it possible to ignore checks on cells (the old behavior) without compromising general security for running src blocks. This is necessary because there is no easy way to hop swap org-confirm-babel-evaluate between org-get-src-block-info where org-babel-read is called and the execution of that src block. It could probably be done using advice around org-babel-read, but that is a level of hackery that should be avoided. --- lisp/ob-core.el | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 62b0d3612..aa73a9cbc 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -128,6 +128,15 @@ remove code block execution from the `\\[org-ctrl-c-ctrl-c]' keybinding." ;; don't allow this variable to be changed through file settings (put 'org-confirm-babel-evaluate 'safe-local-variable (lambda (x) (eq x t))) +(defcustom org-confirm-babel-evaluate-cell t + "Confirm before evaluating a cell. +This follows the same conventions as `org-confirm-babel-evaluate'." + :group 'org-babel + :package-version '(Org . "9.6") + :type '(choice boolean function)) +;; don't allow this variable to be changed through file settings +(put 'org-confirm-babel-evaluate-cell 'safe-local-variable (lambda (x) (eq x t))) + (defcustom org-babel-no-eval-on-ctrl-c-ctrl-c nil "\\<org-mode-map>\ Remove code block evaluation from the `\\[org-ctrl-c-ctrl-c]' key binding." @@ -3180,11 +3189,14 @@ situations in which is it not appropriate." (string= cell "*this*"))) ;; Prevent arbitrary function calls. (if (and (memq (string-to-char cell) '(?\( ?`)) + (if (functionp org-confirm-babel-evaluate-cell) + (funcall org-confirm-babel-evaluate-cell "emacs-lisp" cell) + org-confirm-babel-evaluate-cell) (not (org-babel-confirm-evaluate - ;; See `org-babel-get-src-block-info'. - (list "emacs-lisp" (format "%S" cell) - '((:eval . yes)) nil (format "%S" cell) - nil nil)))) + ;; See `org-babel-get-src-block-info'. + (list "emacs-lisp" (format "%S" cell) + '((:eval . yes)) nil (format "%S" cell) + nil nil)))) ;; Not allowed. (user-error "Evaluation of elisp code %S aborted." cell) (eval (read cell) t))) -- 2.37.4 ^ permalink raw reply related [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-11 21:08 ` Tom Gillespie @ 2022-12-12 10:20 ` Ihor Radchenko 2022-12-13 1:53 ` Tom Gillespie 2022-12-13 4:16 ` Kyle Meyer 0 siblings, 2 replies; 49+ messages in thread From: Ihor Radchenko @ 2022-12-12 10:20 UTC (permalink / raw) To: Tom Gillespie, Bastien; +Cc: Kyle Meyer, emacs-orgmode Tom Gillespie <tgbugs@gmail.com> writes: > Got it. Here's the updated patch (I think I did it correctly?). Thanks! You also need a NEWS entry here. > * lisp/ob-core.el (org-confirm-babel-evaluate-cell): Added to control > execution of cells separate from execution of src blocks, it works in > exactly the same way as org-confirm-babel-evaluate. Please quote `symbols' in the commit message and separate sentences with double space. > +;; don't allow this variable to be changed through file settings > +(put 'org-confirm-babel-evaluate-cell 'safe-local-variable (lambda (x) (eq x t))) You can simply use :safe keyword for `defcustom'. I am also wondering if we should include this into bugfix. This is a new feature, but it appears to be important enough to be merged into built-in Org. Bastien, Kyle, any thoughts? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-12 10:20 ` Ihor Radchenko @ 2022-12-13 1:53 ` Tom Gillespie 2022-12-13 9:03 ` Ihor Radchenko ` (2 more replies) 2022-12-13 4:16 ` Kyle Meyer 1 sibling, 3 replies; 49+ messages in thread From: Tom Gillespie @ 2022-12-13 1:53 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Bastien, Kyle Meyer, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 500 bytes --] Hi Ihor, Here's the updated patch using :safe, and an additional patch for the news entry to make it easier to apply the core change to bugfix if needed. Best! Tom > I am also wondering if we should include this into bugfix. I can vouch for the fact that trying to work around this in any other way is going to be a massive pain. For example, it will be hard to use vanilla 29 for various CI types of things where someone might need to execute a cell but not want to allow arbitrary codeblocks. [-- Attachment #2: 0001-ob-core-add-org-confirm-babel-evaluate-cell-custom-v.patch --] [-- Type: text/x-patch, Size: 3194 bytes --] From 4a78e1b5ea98dee569ff690037c661ab5c300194 Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Sat, 10 Dec 2022 12:11:17 -0800 Subject: [PATCH 1/2] ob-core: add org-confirm-babel-evaluate-cell custom variable * lisp/ob-core.el (org-confirm-babel-evaluate-cell): Added to control execution of cells separate from execution of src blocks, it works in exactly the same way as `org-confirm-babel-evaluate'. * lisp/ob-core.el (org-babel-read): `org-confirm-babel-evaluate-cell' is used to check cells independent of `org-confirm-babel-evaluate'. Following the change in 10e857d42859a55b23cd4206ffce3ebd0f678583 it became extremely annoying to tangle files that make extensive use of elisp expression in src block #+header: statements. This commit resolves the issue by making it possible to ignore checks on cells (the old behavior) without compromising general security for running src blocks. This is necessary because there is no easy way to hop swap `org-confirm-babel-evaluate' between `org-get-src-block-info' where `org-babel-read' is called and the execution of that src block. It could probably be done using advice around `org-babel-read', but that is a level of hackery that should be avoided. --- lisp/ob-core.el | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 2fa9d8978..d56e47de5 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -128,6 +128,14 @@ remove code block execution from the `\\[org-ctrl-c-ctrl-c]' keybinding." ;; don't allow this variable to be changed through file settings (put 'org-confirm-babel-evaluate 'safe-local-variable (lambda (x) (eq x t))) +(defcustom org-confirm-babel-evaluate-cell t + "Confirm before evaluating a cell. +This follows the same conventions as `org-confirm-babel-evaluate'." + :group 'org-babel + :package-version '(Org . "9.6") + :type '(choice boolean function) + :safe (lambda (x) (eq x t))) + (defcustom org-babel-no-eval-on-ctrl-c-ctrl-c nil "\\<org-mode-map>\ Remove code block evaluation from the `\\[org-ctrl-c-ctrl-c]' key binding." @@ -3180,11 +3188,14 @@ situations in which is it not appropriate." (string= cell "*this*"))) ;; Prevent arbitrary function calls. (if (and (memq (string-to-char cell) '(?\( ?`)) + (if (functionp org-confirm-babel-evaluate-cell) + (funcall org-confirm-babel-evaluate-cell "emacs-lisp" cell) + org-confirm-babel-evaluate-cell) (not (org-babel-confirm-evaluate - ;; See `org-babel-get-src-block-info'. - (list "emacs-lisp" (format "%S" cell) - '((:eval . yes)) nil (format "%S" cell) - nil nil)))) + ;; See `org-babel-get-src-block-info'. + (list "emacs-lisp" (format "%S" cell) + '((:eval . yes)) nil (format "%S" cell) + nil nil)))) ;; Not allowed. (user-error "Evaluation of elisp code %S aborted." cell) (eval (read cell) t))) -- 2.37.4 [-- Attachment #3: 0002-etc-ORG-NEWS-Add-entry-for-org-confirm-babel-evaluat.patch --] [-- Type: text/x-patch, Size: 1784 bytes --] From 03aad0a73acfca05245a01e83bae3609e6d3ed04 Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Mon, 12 Dec 2022 17:45:14 -0800 Subject: [PATCH 2/2] * etc/ORG-NEWS: Add entry for `org-confirm-babel-evaluate-cell'. --- etc/ORG-NEWS | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 5d5e726e0..16ff5ba67 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -12,6 +12,42 @@ See the end of the file for license conditions. Please send Org bug reports to mailto:emacs-orgmode@gnu.org. * Version 9.7 (not released yet) + +** New options +*** A new custom setting ~org-confirm-babel-evaluate-cell~ to control confirming execution of cells + +Following recent changes to ~org-babel-read~ it became annoying to +tangle files that make extensive use of elisp expression in src +block #+header: statements. + +~org-confirm-babel-evaluate-cell~ resolves the issue by making it +possible to ignore checks on cells (the old behavior) without +compromising general security for running src blocks. + +It works in the same way as ~org-confirm-babel-evaluate~, accepting a +boolean or a function of two arguments (lang body). + +Here is an example that works for ~(and)~, ~(or)~, and simple calls to +~(identity ...)~. + +#+begin_src emacs-lisp +(setq-local + org-confirm-babel-evaluate-cell + (lambda (lang body) + (ignore lang) + (let ((rb (read body))) + (not ; aka (unless condition t) + (or + (member rb '((or) (and))) + (and + (eq (car rb) 'identity) + (let ((v (cadr rb))) + (or + (symbolp v) + (stringp v) + (numberp v))))))))) +#+end_src + * Version 9.6 ** Important announcements and breaking changes -- 2.37.4 ^ permalink raw reply related [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-13 1:53 ` Tom Gillespie @ 2022-12-13 9:03 ` Ihor Radchenko 2022-12-13 16:31 ` Max Nikulin 2022-12-25 11:06 ` Ihor Radchenko 2 siblings, 0 replies; 49+ messages in thread From: Ihor Radchenko @ 2022-12-13 9:03 UTC (permalink / raw) To: Tom Gillespie; +Cc: Bastien, Kyle Meyer, emacs-orgmode Tom Gillespie <tgbugs@gmail.com> writes: > Hi Ihor, > Here's the updated patch using :safe, and an additional > patch for the news entry to make it easier to apply the > core change to bugfix if needed. Best! LGTM. I will wait a few more days in case if other contributors have something to say and then apply onto bugfix. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-13 1:53 ` Tom Gillespie 2022-12-13 9:03 ` Ihor Radchenko @ 2022-12-13 16:31 ` Max Nikulin 2022-12-13 21:16 ` Tom Gillespie 2022-12-25 11:06 ` Ihor Radchenko 2 siblings, 1 reply; 49+ messages in thread From: Max Nikulin @ 2022-12-13 16:31 UTC (permalink / raw) To: emacs-orgmode On 13/12/2022 08:53, Tom Gillespie wrote: > +(defcustom org-confirm-babel-evaluate-cell t > + "Confirm before evaluating a cell. > +This follows the same conventions as `org-confirm-babel-evaluate'." Will it be clear to users what "cell" means in this context? Am I wrong that, roughly speaking, the effective value is (and org-confirm-babel-evaluate-cell org-confirm-babel-evaluate)? Should it be described in the docstring? It seems e.g. :eval query affects the latter, but not the former. If it is so then it is too complicated for me to feel firm ground while reasoning on security. I have not decided if it is feasible to add some property to the INFO argument passed to `org-babel-confirm-evaluate' and to put there condition which variable should determine result. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-13 16:31 ` Max Nikulin @ 2022-12-13 21:16 ` Tom Gillespie 2022-12-14 16:40 ` Max Nikulin 0 siblings, 1 reply; 49+ messages in thread From: Tom Gillespie @ 2022-12-13 21:16 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode > Will it be clear to users what "cell" means in this context? I assume the language was originally chosen with tables in mind, but I think it is clear? The one issue is that using org-babel-confirm-evaluate doesn't use the word "cell" in the yes-or-no-p prompt. > Am I wrong that, roughly speaking, the effective value is (and > org-confirm-babel-evaluate-cell org-confirm-babel-evaluate)? You are correct. Only in the case that org-confirm-babel-evaluate-cell is or evaluates to t will the yes-or-no-p be displayed _IF_ org-confirm-babel-evaluate is or evaluates to t. org-babel-confirm-evaluate (NOT org-confirm-babel-evaluate) is the function that issues the yes-or-no-p. > Should it be described in the docstring? Maybe? In the current implementation the value of org-confirm-babel-evaluate takes precedence, which I think is the correct behavior. If someone has told us that they blindly want to execute all code, but not cells, we should not change the default behavior, and thus we should execute all cells and blocks > It seems e.g. :eval query affects the latter, but not the former. :eval has no impact on cells. In fact in some files I use :eval (and this-file-done-loading "never") on some blocks that (setq this-file-done-loading) at the end to achieve only-once behavior. > If it is so then it is too complicated for me to feel firm ground > while reasoning on security. :eval has never, and cannot impact evaluation of cells, because it is specifically used to control evaluation of blocks. Similarly :eval has no interaction with any of the confirm-babel-evaluate machinery. I see one possible point of confusion which is that he :eval that you see in the code of org-babel-read is a hack to create fake info for a cell. Are you maybe looking for a file level :eval-cell option/property that would allow you to declare that you should NEVER run cells at all and also never prompt? Basically this is an option that says "treat all cells as if they and their header property are the default value". I'm fairly certain that implementing such a thing is a bad idea, for example if someone sets :dir using a cell and it is overwritten they could execute code in the wrong environment, which can lead to nasty security issues. Thus the only global option for cells that we could safely implement would have the semantics of "treat all cells as if they are (error)". > I have not decided if it is feasible to add some property to the INFO > argument passed to `org-babel-confirm-evaluate' and to put there > condition which variable should determine result. Having done so before, I would rather not touch org-babel-confirm-evaluate if at all possible. The only disadvantage is that for now when users are prompted they will not be informed that it is a cell, however from the short nature of cells the will hopefully be able to figure it out. The fact that org already jumps to the location of the cell in the file helps a lot with this. Obviously this doesn't help in a batch context, but if a user is hitting this in batch mode they are in trouble anyway. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-13 21:16 ` Tom Gillespie @ 2022-12-14 16:40 ` Max Nikulin 2022-12-14 18:24 ` Tom Gillespie 2022-12-15 9:10 ` Ihor Radchenko 0 siblings, 2 replies; 49+ messages in thread From: Max Nikulin @ 2022-12-14 16:40 UTC (permalink / raw) To: emacs-orgmode Tom, does not the following allow to achieve the same without your patch? #+begin_src elisp :results none (setq-local org-confirm-babel-evaluate (lambda (lang body) (not (and (member lang '("elisp" "emacs-lisp")) (let ((rb (read body))) (or (member rb '((or) (and) ;; add more forms that are known safe here )) (and (eq (car rb) 'identity) (let ((v (cadr rb))) (or (symbolp v) (stringp v) (numberp v) ))))))))) #+end_src I know, it does not work, but I think it is due to (format "%S" cell) instead of passing cell directly in - '((:eval . yes)) nil (format "%S" cell) My point is that if some expression is safe for a variable value then it is safe for the source block body. On 14/12/2022 04:16, Tom Gillespie wrote: >> Will it be clear to users what "cell" means in this context? > > I assume the language was originally chosen > with tables in mind, but I think it is clear? The > one issue is that using org-babel-confirm-evaluate > doesn't use the word "cell" in the yes-or-no-p prompt. Have you ever seen the prompt for a table? I suppose, tables are the most prominent security issue related to unsolicited code execution: Max Nikulin to emacs-orgmode. Re: [BUG][Security] begin_src :var evaluated before the prompt to confirm execution. Fri, 28 Oct 2022 11:11:18 +0700. https://list.orgmode.org/tjfkp7$ggm$1@ciao.gmane.io I am still in doubts if 10e857d42 2022-10-28 11:09:50 +0800 Ihor Radchenko: org-babel-read: Obey `org-confirm-babel-evaluate' was an unambiguous improvement. Perhaps it just forces more users to set `org-confirm-babel-evaluate' to nil compromising their security to more severe degree. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-14 16:40 ` Max Nikulin @ 2022-12-14 18:24 ` Tom Gillespie 2022-12-15 9:18 ` Ihor Radchenko 2022-12-15 9:10 ` Ihor Radchenko 1 sibling, 1 reply; 49+ messages in thread From: Tom Gillespie @ 2022-12-14 18:24 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 3825 bytes --] Interestingly, as I was looking through my notes in orgstrap, I see my past self had found a macro org-babel-one-header-arg-safe-p which pointed to defconst org-babel-safe-header-args, but that is a const and not really user configurable. Of course the user could cl-setf on it, but it also only checks strings and has no ability to e.g. see if the value of (symbol-function #'identity) has changed since the check function was defined. Two examples. (let ((old-identity (symbol-function #'identity))) (cl-letf* (((symbol-function #'identity) (lambda (x) (message "there") x))) (identity 'hello) (equal (symbol-function #'identity) old-identity))) (let ((old-and (symbol-function #'and))) (cl-letf* (((symbol-function #'old-andf) old-and) ((symbol-function #'and) (lambda (&rest args) (message "oops %s" args) (old-andf args)))) (list (and) (and 1 2 3) (equal (symbol-function #'and) old-and)))) > Tom, does not the following allow to achieve the same without your patch? It works if I have a closed set of things I want to allow but not if I want to set it to nil to e.g. restore the old behavior (worse for security but not as bad as setting ocbe to nil), e.g. if I'm under duress and need to get something that used to work to work again without the risk of automatically running dangerous code, (e.g. blocks that might rm something). > I know, it does not work, but I think it is due to (format "%S" cell) > instead of passing cell directly in > > - '((:eval . yes)) nil (format "%S" cell) > > My point is that if some expression is safe for a variable value then it > is safe for the source block body. There is another use case here, which I alluded to in the previous comment, which is that sometimes ocbe is the last line of defense against running dangerous code. Ideally users would have set :eval never on blocks like that to be sure, but if they don't you don't want someone already trying to get something to work to get too much to work. Again, this is focused on the ocbec -> nil case. > Have you ever seen the prompt for a table? Err ... maybe? So the answer is probably no. > I suppose, tables are the most prominent security issue related to > unsolicited code execution: For me it would be arbitrary expressions in the headers of source blocks. Hard to know which one is more prevalent across the population of org users. > Max Nikulin to emacs-orgmode. Re: [BUG][Security] begin_src :var > evaluated before the prompt to confirm execution. Fri, 28 Oct 2022 > 11:11:18 +0700. https://list.orgmode.org/tjfkp7$ggm$1@ciao.gmane.io > > I am still in doubts if > > 10e857d42 2022-10-28 11:09:50 +0800 Ihor Radchenko: org-babel-read: Obey > `org-confirm-babel-evaluate' > > was an unambiguous improvement. Perhaps it just forces more users to set > `org-confirm-babel-evaluate' to nil compromising their security to more > severe degree. Heh. It is always a hard balance to strike. In the context of that thread having a variable that would find-file-literally for untrusted org files by default might be useful. Again, it is a pain. I can tell you from experience having written the system that does something similar for orgstrap. There is no safe way other than a user-maintained whitelist based on file hashes, everything else can be spoofed in one way or another. I suspect that once we have the machinery in this patch in place we can look for some sane defaults. Note that the example function we keep passing around isn't quite good enough because someone could probably figure out how to rewrite the identity function so we would need to make sure that it had not changed since emacs was loaded (unlikely, but if I can image it someone could surely do it). [-- Attachment #2: Type: text/html, Size: 4437 bytes --] ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-14 18:24 ` Tom Gillespie @ 2022-12-15 9:18 ` Ihor Radchenko 2022-12-15 9:25 ` Tom Gillespie 2022-12-15 9:57 ` tomas 0 siblings, 2 replies; 49+ messages in thread From: Ihor Radchenko @ 2022-12-15 9:18 UTC (permalink / raw) To: Tom Gillespie; +Cc: Max Nikulin, emacs-orgmode Tom Gillespie <tgbugs@gmail.com> writes: > Interestingly, as I was looking through my notes in > orgstrap, I see my past self had found a macro > org-babel-one-header-arg-safe-p which pointed to > defconst org-babel-safe-header-args, but that is > a const and not really user configurable. It's purpose is also different. I am generally skeptical about our ability to provide universal way to judge if a given sexp is safe or not. It should be left to the user. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 9:18 ` Ihor Radchenko @ 2022-12-15 9:25 ` Tom Gillespie 2022-12-15 9:57 ` tomas 1 sibling, 0 replies; 49+ messages in thread From: Tom Gillespie @ 2022-12-15 9:25 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Max Nikulin, emacs-orgmode > It's purpose is also different. > I am generally skeptical about our ability to provide universal way to > judge if a given sexp is safe or not. It should be left to the user. I am in complete agreement. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 9:18 ` Ihor Radchenko 2022-12-15 9:25 ` Tom Gillespie @ 2022-12-15 9:57 ` tomas 1 sibling, 0 replies; 49+ messages in thread From: tomas @ 2022-12-15 9:57 UTC (permalink / raw) To: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 510 bytes --] On Thu, Dec 15, 2022 at 09:18:14AM +0000, Ihor Radchenko wrote: > Tom Gillespie <tgbugs@gmail.com> writes: [...] > I am generally skeptical about our ability to provide universal way to > judge if a given sexp is safe or not. It should be left to the user. This might live in the middle of some thicket deep in the intersection of Undecidability Plains and Ill-Definedness Swamps. Crocodiles don't dare near there and nobody knows whether there are Dragons. Or something :-) Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-14 16:40 ` Max Nikulin 2022-12-14 18:24 ` Tom Gillespie @ 2022-12-15 9:10 ` Ihor Radchenko 2022-12-15 12:10 ` Max Nikulin 1 sibling, 1 reply; 49+ messages in thread From: Ihor Radchenko @ 2022-12-15 9:10 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: > I am still in doubts if > > 10e857d42 2022-10-28 11:09:50 +0800 Ihor Radchenko: org-babel-read: Obey > `org-confirm-babel-evaluate' > > was an unambiguous improvement. Perhaps it just forces more users to set > `org-confirm-babel-evaluate' to nil compromising their security to more > severe degree. Should we then extend `org-babel-check-evaluate' to accept "All" answer in the coming bugfix release? Then, users may conveniently allow evaluation without a push to disable the prompt altogether. In future release, we may go for more powerful prompt as discussed in https://orgmode.org/list/8735cyxonl.fsf@localhost -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 9:10 ` Ihor Radchenko @ 2022-12-15 12:10 ` Max Nikulin 2022-12-15 12:25 ` Ihor Radchenko 0 siblings, 1 reply; 49+ messages in thread From: Max Nikulin @ 2022-12-15 12:10 UTC (permalink / raw) To: emacs-orgmode On 15/12/2022 16:10, Ihor Radchenko wrote: > Max Nikulin writes: > >> I am still in doubts if >> >> 10e857d42 2022-10-28 11:09:50 +0800 Ihor Radchenko: org-babel-read: Obey >> `org-confirm-babel-evaluate' >> >> was an unambiguous improvement. Perhaps it just forces more users to set >> `org-confirm-babel-evaluate' to nil compromising their security to more >> severe degree. > > Should we then extend `org-babel-check-evaluate' to accept "All" answer > in the coming bugfix release? I would consider reverting the commit causing user prompt for every variable. I believe, there should be single prompt on attempt to execute a source block. I admit it is not easy to implement. Main purpose of the new patch is to allow old behavior. Unfortunately it adds more complexity to logic around user prompts and classifying some expressions as safe. I am not comfortable with attempts to consider Org as a format for web browser similar to HTML: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=58774 Features great for personal notebooks and authoring of documents are disaster for documents from non-trusted sources. In particular, I consider the following reaction as unreasonably optimistic. I am afraid, a lot of work is required to achieve such goal. https://list.orgmode.org/Y1uFDWOjZb85lk+3@protected.localdomain Re: [BUG][Security] begin_src :var evaluated before the prompt to confirm execution On 28/10/2022 14:30, Jean Louis wrote: > * Ihor Radchenko [2022-10-28 06:19]: >> Jean Louis writes: >>> * Max Nikulin [2022-10-27 06:21]: >>>> Expected result: >>>> No code from the Org buffer and linked files is executed prior to >>>> confirmation from the user. >>> >>> Should that be or is it a general policy for Org mode? >> >> Yes, it is a general policy. >> Org should not execute arbitrary Elisp without confirmation, unless the >> user customizes the confirmation query to non-default. > > That is nice to know. It opens doors for browsing Org files within Emacs. On 15/12/2022 16:10, Ihor Radchenko wrote: > In future release, we may go for more powerful prompt as discussed in > https://orgmode.org/list/8735cyxonl.fsf@localhost Single prompt for whole bunch of code related to particular block was not discussed in that thread, that time the issue was not as sever as now. By the way, is it reliable to use (buffer-file-name (buffer-base-buffer)) in `org-confirm-babel-evaluate' to determine if some file resides in a "safe" directory? It may be discussed in that thread. I believe that :var code is equally dangerous to the source block body. However while nobody pushes Org as a web browser format, it is better to implement a transparent and consistent approach to prevention of non-trusted code execution. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 12:10 ` Max Nikulin @ 2022-12-15 12:25 ` Ihor Radchenko 2022-12-15 14:46 ` Max Nikulin 0 siblings, 1 reply; 49+ messages in thread From: Ihor Radchenko @ 2022-12-15 12:25 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: >> Should we then extend `org-babel-check-evaluate' to accept "All" answer >> in the coming bugfix release? > > I would consider reverting the commit causing user prompt for every > variable. I disagree. If anything, we can set the default value of `org-confirm-babel-evaluate-cell' to nil and apply this patch. Then, we can get the old behaviour back yet allowing concerned users to have more security. > ... I believe, there should be single prompt on attempt to execute > a source block. I admit it is not easy to implement. This patch does not only affect src blocks. It affects all the users of `org-babel-read'. Note that my suggestion about "All" may as well include "All in current block/Yes". It should not be too hard to implement, I think. > I am not comfortable with attempts to consider Org as a format for web > browser similar to HTML: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=58774 > Features great for personal notebooks and authoring of documents are > disaster for documents from non-trusted sources. > > In particular, I consider the following reaction as unreasonably > optimistic. I am afraid, a lot of work is required to achieve such goal. > > https://list.orgmode.org/Y1uFDWOjZb85lk+3@protected.localdomain > Re: [BUG][Security] begin_src :var evaluated before the prompt to > confirm execution How is it related to the current discussion? The purpose of the security feature discussed here is not for web browsers or anything like that. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 12:25 ` Ihor Radchenko @ 2022-12-15 14:46 ` Max Nikulin 2022-12-15 21:08 ` Tim Cross 2022-12-18 14:12 ` Ihor Radchenko 0 siblings, 2 replies; 49+ messages in thread From: Max Nikulin @ 2022-12-15 14:46 UTC (permalink / raw) To: emacs-orgmode On 15/12/2022 19:25, Ihor Radchenko wrote: > Max Nikulin writes: > >> I would consider reverting the commit causing user prompt for every >> variable. > > I disagree. If anything, we can set the default value of > `org-confirm-babel-evaluate-cell' to nil and apply this patch. > > Then, we can get the old behaviour back yet allowing concerned users to > have more security. I am leaving it up to you. Form my point of view it will be dead code that increases complexity with no practical outcome. Unfortunately setting `org-confirm-babel-evaluate-cell' to anything other than nil results in annoyance rather than security. Perhaps advising `org-babel-execute-src-block' with `y-or-n-p' is a better treatment for my paranoia. > This patch does not only affect src blocks. It affects all the users of > `org-babel-read'. Mostly it is called with INHIBIT-LISP-EVAL set to t. >> https://list.orgmode.org/Y1uFDWOjZb85lk+3@protected.localdomain >> Re: [BUG][Security] begin_src :var evaluated before the prompt to >> confirm execution > > How is it related to the current discussion? > The purpose of the security feature discussed here is not for web > browsers or anything like that. I am not going to add malicious source blocks to my private org files. For some code it is better to have a prompt, but generally the issue is not excessively important. I tend to inspect org files fetched from net in some other application at first (browser, less, or vim). Accidental evaluation of code is a real danger for those who insist on opening links to org file directly in emacs or even propose to use org as a kind of browser. I raised the security issue in response to passionate messages demanding direct ways to work with org files from the web. I decided to remind the context with hope that it would help to reevaluate severity of the issue. I do not have a better proposal, but I think I see movement in a wrong direction. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 14:46 ` Max Nikulin @ 2022-12-15 21:08 ` Tim Cross 2022-12-16 6:07 ` Ihor Radchenko 2022-12-18 14:12 ` Ihor Radchenko 1 sibling, 1 reply; 49+ messages in thread From: Tim Cross @ 2022-12-15 21:08 UTC (permalink / raw) To: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: > On 15/12/2022 19:25, Ihor Radchenko wrote: >> Max Nikulin writes: >> >>> I would consider reverting the commit causing user prompt for every >>> variable. >> I disagree. If anything, we can set the default value of >> `org-confirm-babel-evaluate-cell' to nil and apply this patch. >> Then, we can get the old behaviour back yet allowing concerned users to >> have more security. > > I am leaving it up to you. Form my point of view it will be dead code that increases > complexity with no practical outcome. Unfortunately setting > `org-confirm-babel-evaluate-cell' to anything other than nil results in annoyance rather > than security. > > Perhaps advising `org-babel-execute-src-block' with `y-or-n-p' is a better treatment for > my paranoia. > >> This patch does not only affect src blocks. It affects all the users of >> `org-babel-read'. > > Mostly it is called with INHIBIT-LISP-EVAL set to t. > >>> https://list.orgmode.org/Y1uFDWOjZb85lk+3@protected.localdomain >>> Re: [BUG][Security] begin_src :var evaluated before the prompt to >>> confirm execution >> How is it related to the current discussion? >> The purpose of the security feature discussed here is not for web >> browsers or anything like that. > > I am not going to add malicious source blocks to my private org files. For some code it is > better to have a prompt, but generally the issue is not excessively important. I tend to > inspect org files fetched from net in some other application at first (browser, less, or > vim). > While I would argue that is a good practice, it isn't always practicable for all users. For example, Emacs together with Emacspeak is my primary accessible interface. While I could use a browser, it would be severely inconvenient and frustrating. I have to admit I also have some concerns here. These may or may not be well founded. My biggest concern is that we don't seem to have a clear security model. It feels like we are responding to security threats in a piecemeal and reactive manner and without any clear model. As a result, there is a risk we will end up with a complex solution where we don't fully understand how all the separate pieces interact. This could result in a complex configuration with a low level of confidence, two of the worst attributes to have when it comes to security. > Accidental evaluation of code is a real danger for those who insist on opening links to > org file directly in emacs or even propose to use org as a kind of browser. I raised the > security issue in response to passionate messages demanding direct ways to work with org > files from the web. I decided to remind the context with hope that it would help to > reevaluate severity of the issue. > My concern here is that given the power of link configuration, source blocks, local variables, .dir-local, evaluated block header code etc, it is extremely difficult to actually know when code will be executed. One thing I do feel is a risk is that if we don't get the right balance, the questions about code evaluation may fall to the level of annoying noise which people get rid of by simply enabling all code evaluation without question. Obviously, this would be a very bad security decision, but as we know from years of experience, users will frequently prioritise convenience over security. If they are unnecessarily 'nagged' regarding code evaluation, I suspect this is what will happen (noting that unnecessary is very subjective). > I do not have a better proposal, but I think I see movement in a wrong direction. I'm not sure if I have a better proposal either. I'm not even sure if this is solely an org issue. It could be that Emacs itself needs a clearer or better understood and explicit security model. This seems particularly relevant given the growth in support for downloading, installing and running code from packages distributed by repositories with no assessment or vetting of code. I find it quite inconsistent that when I download and install a new theme, I have to explicitly mark it as 'safe', but I can download a package from melpa, elpa etc with no additional checks or without having to agree to allow access to whatever service or data it wants. I do wonder if it would be a good idea to try and document when org will evaluate code in org files. This would include not just babel block evaluation, but also elisp evaluation in table formulas, block header arguments, file option arguments and possibly other subtle cases. This may enable us to see if we have the granularity of controls correct or identify inconsistencies and omissions. This information might then be useful in defining a security model which could then identify what controls are actually necessary and how to implement them to provide a more straight-forward configuration for end users. It could also provide valuable input into what additional tests may be necessary to ensure things are working as expected. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 21:08 ` Tim Cross @ 2022-12-16 6:07 ` Ihor Radchenko 2022-12-16 7:22 ` Tim Cross 0 siblings, 1 reply; 49+ messages in thread From: Ihor Radchenko @ 2022-12-16 6:07 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-orgmode Tim Cross <theophilusx@gmail.com> writes: > I do wonder if it would be a good idea to try and document when org will > evaluate code in org files. This would include not just babel block > evaluation, but also elisp evaluation in table formulas, block header > arguments, file option arguments and possibly other subtle cases. This > may enable us to see if we have the granularity of controls correct or > identify inconsistencies and omissions. This information might then be > useful in defining a security model which could then identify what > controls are actually necessary and how to implement them to provide a > more straight-forward configuration for end users. It could also provide > valuable input into what additional tests may be necessary to ensure > things are working as expected. 17.13 Code Evaluation and Security Issues -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-16 6:07 ` Ihor Radchenko @ 2022-12-16 7:22 ` Tim Cross 2022-12-18 14:19 ` Ihor Radchenko 0 siblings, 1 reply; 49+ messages in thread From: Tim Cross @ 2022-12-16 7:22 UTC (permalink / raw) To: Ihor Radchenko; +Cc: emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > Tim Cross <theophilusx@gmail.com> writes: > >> I do wonder if it would be a good idea to try and document when org will >> evaluate code in org files. This would include not just babel block >> evaluation, but also elisp evaluation in table formulas, block header >> arguments, file option arguments and possibly other subtle cases. This >> may enable us to see if we have the granularity of controls correct or >> identify inconsistencies and omissions. This information might then be >> useful in defining a security model which could then identify what >> controls are actually necessary and how to implement them to provide a >> more straight-forward configuration for end users. It could also provide >> valuable input into what additional tests may be necessary to ensure >> things are working as expected. > > 17.13 Code Evaluation and Security Issues That page is a good start. However, I think it highlights why not having a clear model limits the utility of the options being provided. Consider this scenario - I am a reasonably experienced Emacs user, but wouldn't describe myself as proficient with elisp. I can do some basic stuff and I have an init.el file which I basically understand, although there are some borrowed bits which to be honest, I don't fully understand. I use org mode a lot. I really like literate programming and find the whole babel stuff really cool. I also make extensive use of tables and the spreadsheet capability to track statistics on my projects and use gnuplot, ditta and plantuml to generate plot, diagrams etc from that data. Obviously, I trust all the code in these files as I wrote it! On occasion, I get org files from colleagues. While I do basically trust my colleagues, I don't want to just blindly allow execution of the code in these files. I would like to check what the code does before agreeing to allow it to run. On very rare occasions, I get an org file from an untrusted source. In this situation, I want iron clad assurances none of the code from this file is executed. Based on the information in section 17.13, how do I configure my Emacs so that 1. All the code in the files I wrote just runs and doesn't bother me with annoying execute questions. 2. Code in files from colleagues is shown to me and I'm asked if it should be executed. Once I say yes, I don't want to be bothered about it again i.e. next time I open that file, I want org mode to know I trust it. 3. Absolutely no code in files which are not from the two preceding sources is to be executed unless I explicitly approve it. How does this fictitious user achieve this configuration? Is it a reasonable expectation that most users will be able to write the elisp necessary to achieve this model? It feels like what we currently have is a selection of disconnect knobs which the user can tweak, but with no over-arching mechanism to help manage these settings for various scenarios. Finally, are we 100% certain that these different code evaluation circumstances are the only ones? Can we be certain there isn't areas where options or variables are set which couldn't be used to evaluate code (similar to be previously identified execution of code in block headers which occurred before the checks on code evaluation?)? It also feels like the approach we have taken here is almost a throwback to a past era where he had a lot more trust. What we seem to have is protection against accidental execution of code rather than protection against code with malicious intent which has been crafted to be difficult to spot and deliberately takes advantages of small 'holes' or over-sight in the controls supplied. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-16 7:22 ` Tim Cross @ 2022-12-18 14:19 ` Ihor Radchenko 2022-12-18 21:37 ` Tim Cross 0 siblings, 1 reply; 49+ messages in thread From: Ihor Radchenko @ 2022-12-18 14:19 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-orgmode Tim Cross <theophilusx@gmail.com> writes: > Based on the information in section 17.13, how do I configure my Emacs > so that > > 1. All the code in the files I wrote just runs and doesn't bother me with > annoying execute questions. > > 2. Code in files from colleagues is shown to me and I'm asked if it > should be executed. Once I say yes, I don't want to be bothered about it > again i.e. next time I open that file, I want org mode to know I trust > it. > > 3. Absolutely no code in files which are not from the two preceding > sources is to be executed unless I explicitly approve it. Not yet, but I hope that we can integrate the approach we use in `org-safe-remote-resources' and `org--confirm-resource-safe'. > It feels like what we currently have is a selection of disconnect knobs > which the user can tweak, but with no over-arching mechanism to help > manage these settings for various scenarios. Agree. I hope that we can slowly work towards connecting these knobs. > Finally, are we 100% certain that these different code evaluation > circumstances are the only ones? Can we be certain there isn't areas > where options or variables are set which couldn't be used to evaluate > code (similar to be previously identified execution of code in block > headers which occurred before the checks on code evaluation?)? No, we can't. But it is true for any software that allows third-party code, not just for Org or even Emacs. And we cannot use the more universal sandbox approach either. Not in Emacs. > It also feels like the approach we have taken here is almost a throwback > to a past era where he had a lot more trust. What we seem to have is > protection against accidental execution of code rather than protection > against code with malicious intent which has been crafted to be > difficult to spot and deliberately takes advantages of small 'holes' or > over-sight in the controls supplied. I do not think that we can do anything about crafted code in Emacs other than displaying that code and letting the user decide. And I haven't seen any better solution, except anti-virus scanners that are constantly fighting new malicious code. At least, we do show the code. It is already better than "yes/no" dialogue you get when running random executable on Windows. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-18 14:19 ` Ihor Radchenko @ 2022-12-18 21:37 ` Tim Cross 2022-12-20 0:00 ` Tom Gillespie 0 siblings, 1 reply; 49+ messages in thread From: Tim Cross @ 2022-12-18 21:37 UTC (permalink / raw) To: Ihor Radchenko; +Cc: emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > Tim Cross <theophilusx@gmail.com> writes: > >> Based on the information in section 17.13, how do I configure my Emacs >> so that >> >> 1. All the code in the files I wrote just runs and doesn't bother me with >> annoying execute questions. >> >> 2. Code in files from colleagues is shown to me and I'm asked if it >> should be executed. Once I say yes, I don't want to be bothered about it >> again i.e. next time I open that file, I want org mode to know I trust >> it. >> >> 3. Absolutely no code in files which are not from the two preceding >> sources is to be executed unless I explicitly approve it. > > Not yet, but I hope that we can integrate the approach we use in > `org-safe-remote-resources' and `org--confirm-resource-safe'. > >> It feels like what we currently have is a selection of disconnect knobs >> which the user can tweak, but with no over-arching mechanism to help >> manage these settings for various scenarios. > > Agree. I hope that we can slowly work towards connecting these knobs. > >> Finally, are we 100% certain that these different code evaluation >> circumstances are the only ones? Can we be certain there isn't areas >> where options or variables are set which couldn't be used to evaluate >> code (similar to be previously identified execution of code in block >> headers which occurred before the checks on code evaluation?)? > > No, we can't. But it is true for any software that allows third-party > code, not just for Org or even Emacs. > Yes, you are right there are no guarantees. However, I do feel that if we are going to add this security layer, we also need to perform some form of audit and documentation of the specific points where org constructs will/can trigger evaluation of included code. As the bug with rich text demonstrated, there will likely be corner cases we miss. However, we should at least try to identify as many as possible and document them (and include automated tests when possible). One of the downsides regarding improved security controls is that it raises the level of expectations. We need to try and ensure we meet those expectations. What we really need are some good ethical hackers to help us identify potential 'hot spots'. The ability to do this effectively does involve a particular type of mind set and skills not necessarily common amongst most users. > And we cannot use the more universal sandbox approach either. Not in > Emacs. > >> It also feels like the approach we have taken here is almost a throwback >> to a past era where he had a lot more trust. What we seem to have is >> protection against accidental execution of code rather than protection >> against code with malicious intent which has been crafted to be >> difficult to spot and deliberately takes advantages of small 'holes' or >> over-sight in the controls supplied. > > I do not think that we can do anything about crafted code in Emacs other > than displaying that code and letting the user decide. > Agreed. What we need next is the ability to track those decisions so that the user isn't nagged about the same things every time and the ability to set different defaults based on some preference (such as source/origin, location, etc. > And I haven't seen any better solution, except anti-virus scanners that > are constantly fighting new malicious code. > > At least, we do show the code. It is already better than "yes/no" > dialogue you get when running random executable on Windows. Agree. The question is whether we actually do provide that y-n and display in sufficient situations. Given the additional information you provided, I'm somewhat less concerned. These 'knobs' definitely do need some form of additional abstraction which will more easily allow end users to set a basic policy regarding the treatment of different org files or org files from different sources. I suspect, in the long-term, we are likely to need some type of file 'cookie' i.e. a local-variable setting which will either set the policy for that file or set the origin/source/trust level etc so that whatever security policy the user has defined can be applied. IN some ways, similar to the 'cookie' placed into your custom variables when you say you trust some new theme. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-18 21:37 ` Tim Cross @ 2022-12-20 0:00 ` Tom Gillespie 2022-12-20 0:06 ` Tom Gillespie 0 siblings, 1 reply; 49+ messages in thread From: Tom Gillespie @ 2022-12-20 0:00 UTC (permalink / raw) To: Tim Cross; +Cc: Ihor Radchenko, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 432 bytes --] By the way, while we're on bugfixes. I just noticed that (format "%S" cell) is being used to create the fake body for info. This is incorrect because cell is already a string at this point and this makes the behavior inconsistent with the rest of org babel as a result. Fix below. Best, Tom The fix is to pass (list "emacs-lisp" cell '((:eval . yes)) nil cell nil nil) [-- Attachment #2: Type: text/html, Size: 740 bytes --] ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-20 0:00 ` Tom Gillespie @ 2022-12-20 0:06 ` Tom Gillespie 2022-12-25 11:00 ` Ihor Radchenko 0 siblings, 1 reply; 49+ messages in thread From: Tom Gillespie @ 2022-12-20 0:06 UTC (permalink / raw) To: Tim Cross; +Cc: Ihor Radchenko, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 295 bytes --] One more correction. The source of the issue is that the two values in the list need to be different, one for the message and one for the actual test. Best, Tom (list "emacs-lisp" cell '((:eval . yes)) nil (format "%S" cell) nil nil) [-- Attachment #2: Type: text/html, Size: 546 bytes --] ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-20 0:06 ` Tom Gillespie @ 2022-12-25 11:00 ` Ihor Radchenko 0 siblings, 0 replies; 49+ messages in thread From: Ihor Radchenko @ 2022-12-25 11:00 UTC (permalink / raw) To: Tom Gillespie; +Cc: Tim Cross, emacs-orgmode Tom Gillespie <tgbugs@gmail.com> writes: > One more correction. The source of the issue is that the two values in the > list need to be different, one for the message and one for the actual test. > Best, > Tom > > (list "emacs-lisp" cell > '((:eval . yes)) nil (format "%S" cell) > nil nil) Makes sense. "%s" for printed string is even better. Fixed on bugfix. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=7f2f73c41 -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-15 14:46 ` Max Nikulin 2022-12-15 21:08 ` Tim Cross @ 2022-12-18 14:12 ` Ihor Radchenko 1 sibling, 0 replies; 49+ messages in thread From: Ihor Radchenko @ 2022-12-18 14:12 UTC (permalink / raw) To: Max Nikulin; +Cc: emacs-orgmode Max Nikulin <manikulin@gmail.com> writes: >> I disagree. If anything, we can set the default value of >> `org-confirm-babel-evaluate-cell' to nil and apply this patch. >> >> Then, we can get the old behaviour back yet allowing concerned users to >> have more security. > > I am leaving it up to you. Form my point of view it will be dead code > that increases complexity with no practical outcome. Unfortunately > setting `org-confirm-babel-evaluate-cell' to anything other than nil > results in annoyance rather than security. To clarify, I do not consider this patch to be the end state of security handling. I do plan to extend the code evaluation query in a way that it can be used to allow "All" in current command call, session, + mark files as safe, similar to `org--confirm-resource-safe'. Just not yet in this release. So, I don't think that the code is going to be dead. The new variable is also in line with the existing `org-link-elisp-confirm-function', `org-link-shell-confirm-function', and `org-confirm-babel-evaluate'. > Perhaps advising `org-babel-execute-src-block' with `y-or-n-p' is a > better treatment for my paranoia. Emm. No? The main issue with `y-or-n-p' is that it treats <SPC> as "yes". I have pressed <SPC> painstakingly in prompts too many times to consider y-or-n-p safe. >> This patch does not only affect src blocks. It affects all the users of >> `org-babel-read'. > > Mostly it is called with INHIBIT-LISP-EVAL set to t. No, not really. From skimming through grep buffer, most of the calls are not inhibiting `eval'. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-13 1:53 ` Tom Gillespie 2022-12-13 9:03 ` Ihor Radchenko 2022-12-13 16:31 ` Max Nikulin @ 2022-12-25 11:06 ` Ihor Radchenko 2022-12-29 15:58 ` Bastien Guerry 2 siblings, 1 reply; 49+ messages in thread From: Ihor Radchenko @ 2022-12-25 11:06 UTC (permalink / raw) To: Tom Gillespie, Bastien; +Cc: Kyle Meyer, emacs-orgmode Tom Gillespie <tgbugs@gmail.com> writes: > From 4a78e1b5ea98dee569ff690037c661ab5c300194 Mon Sep 17 00:00:00 2001 > From: Tom Gillespie <tgbugs@gmail.com> > Date: Sat, 10 Dec 2022 12:11:17 -0800 > Subject: [PATCH 1/2] ob-core: add org-confirm-babel-evaluate-cell custom > variable Bastien, may you please take a look at this discussion? As pointed by this patch, the current behaviour of asking users about code evaluation every single time will increase the odds to set `org-confirm-babel-evaluate' to t and never come back. We may not want to do it. Instead, we may apply this patch, but using an opposite default value of this new variable - do not confirm. The end result after applying will then be the same as in the previous release. Or we may apply this patch + extend the confirmation dialogue to accept "All" answer to confirm execution for the duration of `this-command'. WDYT? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-25 11:06 ` Ihor Radchenko @ 2022-12-29 15:58 ` Bastien Guerry 2022-12-29 16:33 ` Max Nikulin 2022-12-29 16:35 ` Ihor Radchenko 0 siblings, 2 replies; 49+ messages in thread From: Bastien Guerry @ 2022-12-29 15:58 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Tom Gillespie, Kyle Meyer, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > Tom Gillespie <tgbugs@gmail.com> writes: > >> From 4a78e1b5ea98dee569ff690037c661ab5c300194 Mon Sep 17 00:00:00 2001 >> From: Tom Gillespie <tgbugs@gmail.com> >> Date: Sat, 10 Dec 2022 12:11:17 -0800 >> Subject: [PATCH 1/2] ob-core: add org-confirm-babel-evaluate-cell custom >> variable > > Bastien, may you please take a look at this discussion? I've skimmed through the discussion but I'm not entirely clear about the situation. Has the situation changed between 9.5 and 9.6? Tom first message seems to suggest it did, but etc/ORG-NEWS does not say. Whether it changed or not, what is the problem in 9.6? How does the patch solves this problem? Is it a temporary change while we wait for a better change? In particular, I'm not sure I understand why this should be added to 9.6.1---I'm not opposed to it, I just try to understand. Also, org-confirm-babel-evaluate-table-cell seems more explicit than org-confirm-babel-evaluate-cell. Thanks! -- Bastien ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-29 15:58 ` Bastien Guerry @ 2022-12-29 16:33 ` Max Nikulin 2022-12-29 16:35 ` Ihor Radchenko 1 sibling, 0 replies; 49+ messages in thread From: Max Nikulin @ 2022-12-29 16:33 UTC (permalink / raw) To: emacs-orgmode On 29/12/2022 22:58, Bastien Guerry wrote: >>> From: Tom Gillespie >>> Date: Sat, 10 Dec 2022 12:11:17 -0800 >>> Subject: [PATCH 1/2] ob-core: add org-confirm-babel-evaluate-cell custom >>> variable ... > Has the situation changed between 9.5 and 9.6? Yes, it has. In 9.6 C-c C-c for #+begin_src elisp :var v1=(identity #o755) v2=(identity #o444) v3=(identity #o600) (list v1 v2 v3) #+end_src issues 4 queries if elisp code should be executed (3 variables and the src block body). In 9.5 variable values evaluated before the single prompt (so "no" did not prevent execution of some code). ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-29 15:58 ` Bastien Guerry 2022-12-29 16:33 ` Max Nikulin @ 2022-12-29 16:35 ` Ihor Radchenko 2022-12-30 8:52 ` Bastien 1 sibling, 1 reply; 49+ messages in thread From: Ihor Radchenko @ 2022-12-29 16:35 UTC (permalink / raw) To: Bastien Guerry; +Cc: Tom Gillespie, Kyle Meyer, emacs-orgmode Bastien Guerry <bzg@gnu.org> writes: > I've skimmed through the discussion but I'm not entirely clear about > the situation. > > Has the situation changed between 9.5 and 9.6? Tom first message > seems to suggest it did, but etc/ORG-NEWS does not say. I considered this change as a bugfix. Though it was more user-facing than I anticipated. What changed: The prompt previously displayed on code block evaluation is now also displayed when expanding header arguments: #+begin_src emacs-lisp :var x = (message "pwned!") (concat x "foo") #+end_src Before Org 9.6: 1. "pwned!" is displayed 2. Query to evaluate code block is displayed Org 9.6: 1. Query to evaluate (message "pwned!") is displayed 2. If confirmed, it is evaluated 3. Query to evaluate the whole code block is displayed > Whether it changed or not, what is the problem in 9.6? The problem is that Org now displays more queries. > How does the patch solves this problem? It allows disabling these new queries about lisp evaluation outside code blocks without disabling code block eval confirmation completely. I later suggested disabling the queries by default - mimicking the pre 9.6 behaviour yet keeping the ability for concerned users enable the extra confirmation. > Is it a temporary change while we wait for a better change? Yes. Ideally, we need to improve the code evaluation query. It should allow confirming evaluation in bulk and add some code blocks/files to whitelist. Similar to `org--confirm-resource-safe'. > In particular, I'm not sure I understand why this should be added to > 9.6.1---I'm not opposed to it, I just try to understand. A concern have been expressed that more queries may annoy users and drive them towards setting `org-confirm-babel-evaluate' to nil globally. Upon doing this, the future more flexible security queries may be not used by such users. > Also, org-confirm-babel-evaluate-table-cell seems more explicit than > org-confirm-babel-evaluate-cell. But it will not be accurate. The query is now displayed upon executing `org-babel-read' -- cell refers to Elisp code "cell" here. Not to a table cell. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-29 16:35 ` Ihor Radchenko @ 2022-12-30 8:52 ` Bastien 2022-12-30 11:10 ` Max Nikulin 2022-12-30 17:43 ` Tom Gillespie 0 siblings, 2 replies; 49+ messages in thread From: Bastien @ 2022-12-30 8:52 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Tom Gillespie, Kyle Meyer, emacs-orgmode Thanks a lot for the detailed answer, very helpful. > What changed: The prompt previously displayed on code block evaluation > is now also displayed when expanding header arguments: I see nothing in etc/ORG-NEWS that describes this change: am I missing something? >> Whether it changed or not, what is the problem in 9.6? > > The problem is that Org now displays more queries. > >> How does the patch solves this problem? > > It allows disabling these new queries about lisp evaluation outside > code blocks without disabling code block eval confirmation completely. Is there a real use-case for this? It looks like the patch fixes the "too many queries" problem by providing a setup that is similar to what was the previous default (i.e. only asking about code block evaluation when org-confirm-babel-evaluate-cell is set to nil.) But are we sure that users need to confirm header args evaluation separately from code blocks evaluation? IOW I have difficulties understanding when these would be relevant: (setq org-confirm-babel-evaluate-cell nil) (setq org-confirm-babel-evaluate t) > I later suggested disabling the queries by default - mimicking the pre > 9.6 behaviour yet keeping the ability for concerned users enable the > extra confirmation. I think that's the best route: providing, optionnally, more, while not annoying users who don't want more. > Yes. Ideally, we need to improve the code evaluation query. It should > allow confirming evaluation in bulk and add some code blocks/files to > whitelist. Similar to `org--confirm-resource-safe'. I see, indeed. > A concern have been expressed that more queries may annoy users and > drive them towards setting `org-confirm-babel-evaluate' to nil globally. > Upon doing this, the future more flexible security queries may be not > used by such users. The future more flexible security queries will be made visibile enough so that users currently setting `org-confirm-babel-evaluate' to nil will *want* to have a look at it. >> Also, org-confirm-babel-evaluate-table-cell seems more explicit than >> org-confirm-babel-evaluate-cell. > > But it will not be accurate. The query is now displayed upon executing > `org-babel-read' -- cell refers to Elisp code "cell" here. Not to a > table cell. I find "cell" confusing here (as Max said earlier in the thread). It either refers to a table cell or, in Elisp jargon, a "cons cell" (or a "function cell"). What about modifying `org-confirm-babel-evaluate' to allow these values: - t : confirm header vars *and* code blocks - 'code : confirm code blocks - 'vars : confirm vars - nil : don't confirm and set the default value to 'code, while allowing concerned users to set it to `t' -- until we have a better system for evaluation query. WDYT? -- Bastien ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-30 8:52 ` Bastien @ 2022-12-30 11:10 ` Max Nikulin 2022-12-30 17:43 ` Tom Gillespie 1 sibling, 0 replies; 49+ messages in thread From: Max Nikulin @ 2022-12-30 11:10 UTC (permalink / raw) To: emacs-orgmode On 30/12/2022 15:52, Bastien wrote: > But are we sure that users need to confirm header args evaluation > separately from code blocks evaluation? I do not think we need to confirm header arguments *separately*, but they should not be executed before asking users. It is not easy to implement request for header arguments in another way. Commit 10e857d42 2022-10-28 11:09:50 +0800 Ihor Radchenko: org-babel-read: Obey `org-confirm-babel-evaluate' was a reaction to Max Nikulin. [BUG][Security] begin_src :var evaluated before the prompt to confirm execution. Thu, 27 Oct 2022 10:18:05 +0700. https://list.orgmode.org/tjct9e$179u$1@ciao.gmane.io The latter partially was caused by demand to open arbitrary Org files downloaded from net in Emacs. https://debbugs.gnu.org/cgi/bugreport.cgi?bug=58774 [WISH]: Let us make EWW browse WWW Org files correctly Accidental unsolicited code execution due to unintentional C-c C-c may be rather dangerous, it does not depend if it is source block body, header arguments, or table formula (the latter may still be activated by just TAB). Org-9.5 behavior is not ideal but at least acceptable for most of trusted (e.g. private) Org files. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-30 8:52 ` Bastien 2022-12-30 11:10 ` Max Nikulin @ 2022-12-30 17:43 ` Tom Gillespie 2022-12-31 13:48 ` Ihor Radchenko 2023-01-02 15:15 ` Bastien 1 sibling, 2 replies; 49+ messages in thread From: Tom Gillespie @ 2022-12-30 17:43 UTC (permalink / raw) To: Bastien; +Cc: Ihor Radchenko, Kyle Meyer, emacs-orgmode Hi Bastien, In short, we need two variables due to the case where a user wants to set nil for all vars and a function for code. More replies in line. Best! Tom > I see nothing in etc/ORG-NEWS that describes this change: am I missing > something? Looks like any mention of the change is missing to me as well. > >> Whether it changed or not, what is the problem in 9.6? > > > > The problem is that Org now displays more queries. > > > >> How does the patch solves this problem? > > > > It allows disabling these new queries about lisp evaluation outside > > code blocks without disabling code block eval confirmation completely. > Is there a real use-case for this? Yes. To give one example. I have many files that need to run hundreds of cells at tangling/export time. I have reviewed all the code in the cells and know patterns that are safe and wont' burn me. I do not want to allow execution of code blocks blindly during tangling and confirm eval is a secondary line of defense against running those blocks during export. I want to allow the cells to run uninhibited as they did before this change, so that I don't have to fight with org during the tangling process. As it is right now the change has completely broken various CI pipelines for me, and if these changes do not get in to emacs 29 in time I will be unable to use emacs 29 for CI until they are in the base image without having to resort to insane hacks and massive additional configuration changes to work around the issues discussed in the loading multiple org versions thread. > It looks like the patch fixes the "too many queries" problem by > providing a setup that is similar to what was the previous default > (i.e. only asking about code block evaluation when > org-confirm-babel-evaluate-cell is set to nil.) This interpretation is not quite right. org-confirm-babel-evaluate-cell has no interaction with evaluating code blocks, only with evaluating cells. When org-confirm-babel-evaluate-cell is nil or evaluates to nil then the org-babel-confirm-evaluate code runs on a fake block that is created out of the cell. (This is where there is still a bug that I mentioned up thread.) > But are we sure that users need to confirm header args evaluation > separately from code blocks evaluation? I am sure that in my workflow I want them split, especially for global nil/t behavior. I need to think a bit more about your suggestion to add more values to org-confirm-babel-evaluate to see whether it might work and what the relative complexity would be. It seems to me that duplicating the variable is certainly easier to maintain, if not to explain to those who do not use babel regularly. I would be interested to hear from other babel users their thoughts on the design, because it seems obvious to me, but again I wrote the code so am the last person whose view on the clarity of the should be considered. It seems that it was not clear to Max initially. > IOW I have difficulties understanding when these would be relevant: > (setq org-confirm-babel-evaluate-cell nil) Anywhere that a parenthesized elisp expression occurs that is not in #+begin_src block. > (setq org-confirm-babel-evaluate t) Only inside #+begin_src blocks. > I think that's the best route: providing, optionnally, more, while not > annoying users who don't want more. I think this is probably the right default as well. > > Yes. Ideally, we need to improve the code evaluation query. It should > > allow confirming evaluation in bulk and add some code blocks/files to > > whitelist. Similar to `org--confirm-resource-safe'. > > I see, indeed. Improving general code auditing prior to evaluation of blocks would be greatly appreciated. The fighting between the minibuffer and the primary buffer for priority and the fact that you often cannot see that code that will be run is a significant issue. However, this is orthogonal to the issue at hand. > > A concern have been expressed that more queries may annoy users and > > drive them towards setting `org-confirm-babel-evaluate' to nil globally. > > Upon doing this, the future more flexible security queries may be not > > used by such users. > > The future more flexible security queries will be made visibile enough > so that users currently setting `org-confirm-babel-evaluate' to nil > will *want* to have a look at it. Yep. We need to get the fundamentals in place to enable those workflows. I'm too paranoid to simply set that variable to nil, even when I'm only running code that I wrote, but I suppose that is not the case for everyone. > I find "cell" confusing here (as Max said earlier in the thread). It > either refers to a table cell or, in Elisp jargon, a "cons cell" (or a > "function cell"). I also dislike the name cell, but i'm not sure what to call it instead. I mentioned "parenthized elisp expression" above, since strictly speaking they aren't closures, they are any valid elisp sexpression. In the context of org-outside-emacs I imagine a day when those top level expressions might also be written in some other language and there would be some way to indicate at a file or section level or perhaps even single block expression level what language a given cell should be interpreted as. In the context of naming this means that "parentized expression" might not be general enough. Maybe embedded-code or embedded-expression? org-confirm-babel-evaluate-embedded-expressions? > What about modifying `org-confirm-babel-evaluate' to allow these values: > > - t : confirm header vars *and* code blocks > - 'code : confirm code blocks > - 'vars : confirm vars > - nil : don't confirm > > and set the default value to 'code, while allowing concerned users to > set it to `t' -- until we have a better system for evaluation query. > > WDYT? In short this is not a viable solution because there is no way to compose nil for embedded expressions with a function for blocks. We really do not want to change the function signature for the function to also have to accept whether it is a block or an embedded expression. That will break code for everyone. The solution I have proposed keeps blocks and embedded expressions orthogonal precisely to avoid these kinds of major disruptions. Better for users to be confused about how to use a variable but be able to learn about it or ask about it than for all users of a feature to have to suffer major breakages to their existing workflows and have to rewrite existing code to work around something that supposedly increased security. Having two separate variables is the only way to retain backward compatibility and give granular control over evaluation of code blocks and embedded expressions. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-30 17:43 ` Tom Gillespie @ 2022-12-31 13:48 ` Ihor Radchenko 2022-12-31 16:15 ` Tom Gillespie ` (2 more replies) 2023-01-02 15:15 ` Bastien 1 sibling, 3 replies; 49+ messages in thread From: Ihor Radchenko @ 2022-12-31 13:48 UTC (permalink / raw) To: Tom Gillespie; +Cc: Bastien, Kyle Meyer, emacs-orgmode Tom Gillespie <tgbugs@gmail.com> writes: >> What about modifying `org-confirm-babel-evaluate' to allow these values: >> >> - t : confirm header vars *and* code blocks >> - 'code : confirm code blocks >> - 'vars : confirm vars >> - nil : don't confirm >> >> and set the default value to 'code, while allowing concerned users to >> set it to `t' -- until we have a better system for evaluation query. >> >> WDYT? > > In short this is not a viable solution because there is no way > to compose nil for embedded expressions with a function > for blocks. We really do not want to change the function > signature for the function to also have to accept whether > it is a block or an embedded expression. That will break > code for everyone. Agree. The value of `org-confirm-babel-evaluate' can be a function. If we do not change the function signature, there will be no way to provide the code block vs. code cell granularity we are trying to handle. We may, however, make `org-confirm-babel-evaluate' function value accept an extra third argument - context ('code or 'vars). This will retain the required flexibility without introducing an extra variable. P.S. Considering intense discussion around the topic, what about reverting my commit from the release? We can then re-consider the whole design and apply something more elaborate later. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-31 13:48 ` Ihor Radchenko @ 2022-12-31 16:15 ` Tom Gillespie 2023-01-02 8:34 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Ihor Radchenko 2023-01-02 15:13 ` [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable Bastien Guerry 2 siblings, 0 replies; 49+ messages in thread From: Tom Gillespie @ 2022-12-31 16:15 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Bastien, Kyle Meyer, emacs-orgmode > P.S. Considering intense discussion around the topic, what about > reverting my commit from the release? We can then re-consider the whole > design and apply something more elaborate later. I was actually going to mention that in my previous message but forgot. I think that given the potential for disruption and our desire to do a good job on the design of the new system I think it would make sense to revert the commit from the release so that we don't rush in trying to fix something under pressure without taking the time we need to consider all the angles. Best! Tom ^ permalink raw reply [flat|nested] 49+ messages in thread
* [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) 2022-12-31 13:48 ` Ihor Radchenko 2022-12-31 16:15 ` Tom Gillespie @ 2023-01-02 8:34 ` Ihor Radchenko 2023-01-02 10:59 ` [SECURITY] Arbitrary code evaluation security in Org Greg Minshall 2023-01-02 19:00 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Tim Cross 2023-01-02 15:13 ` [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable Bastien Guerry 2 siblings, 2 replies; 49+ messages in thread From: Ihor Radchenko @ 2023-01-02 8:34 UTC (permalink / raw) To: Tom Gillespie; +Cc: Bastien, Kyle Meyer, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > P.S. Considering intense discussion around the topic, what about > reverting my commit from the release? We can then re-consider the whole > design and apply something more elaborate later. I now reverted the discussed commit. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=345402148 We need to come up with a uniform security system where all the code evaluation is (1) easy to control via variables and user queries; (2) not too annoying for users; (3) provides the necessary context for users to decide if a code is safe to run. Before we continue the discussion, I will try to summarize the current state of Org manual and code wrt code evaluation of the code coming from Org documents (including downloaded Org files). In the manual we now have 17.13 Code Evaluation and Security Issues This section talks about 1. Source block bodies and `org-confirm-babel-evaluate' 2. shell/elisp links and `org-link-shell-confirm-function' + `org-link-elisp-confirm-function'. Notably, `org-link-elisp-skip-confirm-regexp' is not mentioned in the manual. 3. Table cells, with no way to query or disable execution. In reality, we have many more places in the code where arbitrary text from Org files can be evaluated. I have marked some places in the above commit with FIXME. From my audit of Org sources the following scenarios may lead to arbitrary code execution: 1. Code block bodies 2. Elisp sexps in header args. Notably, not only `org-babel-read' is responsible for evaluating header args. :results and :exports are evaluated independently. 3. Table cells 4. "eval" macros during expansion 5. Diary sexps To the best of my knowledge, this list should be complete. Though I would appreciate someone double-checking. -------------------- According to the above: - `org-confirm-babel-evaluate' allows either using `org-babel-confirm-evaluate' prompt (when t), not asking at all (when nil), or using arbitrary prompt function. - `org-link-shell-confirm-function' + `org-link-elisp-confirm-function' are similar, except defaulting to `yes-or-no-p'. - `org-link-elisp-skip-confirm-regexp' extends indiscriminate function queries to also skip certain (single) regexp. The situation is not ideal. We have similar, but more detailed system for downloading remote files: - `org-safe-remote-resources' allows users to define certain files/urls that are known to be safe - `org-resource-download-policy' provides choice between "always query", "query unless safe", "never download", and "always download" Also, `org--confirm-resource-safe', unlike `org-babel-confirm-evaluate' allows manipulating `org-safe-remote-resources' interactively by marking current URL or URL domain safe for future. ------------------------ What we can do 1. Introduce a new customization `org-confirm-evaluate-safe-regexps' listing regexps that are considered safe or cons cells (src-body/header-arg/table/macro/diary . regexp) 2. Introduce a new customization `org-confirm-evaluate' that can be set to t/nil/prompt/safe/[function]/[alist]: - t/safe :: to display default prompt unless the code block in buffer is marked safe - prompt :: always ask (the prompt will then not display options to add current sexp to safe list) - [function] :: custom function that returns t/safe/prompt/[alist] - [alist] :: (src-body/header-arg/table/macro/diary/t . t/safe/prompt/function) (t . <value>) stands for default value. 3. The default prompt will mimic `org--confirm-resource-safe', additionally accepting Y/N to accept/decline all the evaluation in current command. This system will be used across Org for code evaluation. Old variables will be supported, but obsoleted. WDYT? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [SECURITY] Arbitrary code evaluation security in Org 2023-01-02 8:34 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Ihor Radchenko @ 2023-01-02 10:59 ` Greg Minshall 2023-01-03 9:52 ` [SECURITY] Tangling can overwrite arbitrary tangling targets, including important user files (was: [SECURITY] Arbitrary code evaluation security in Org) Ihor Radchenko 2023-01-02 19:00 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Tim Cross 1 sibling, 1 reply; 49+ messages in thread From: Greg Minshall @ 2023-01-02 10:59 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Tom Gillespie, Bastien, Kyle Meyer, emacs-orgmode Ihor, thanks for this. one additional item (i don't *think* we discussed this before; apologies if i'm forgetting): tangling. if one is prompted to "merely" tangle ... ---- #+begin_src sh :tangle /var/tmp/foo.org.tangled echo 'hi!' #+end_src ---- one could imagine more sinister scenarios for destination, content. i don't really know what, how much, to do. possibly just an option, defaulting to =nil=, allowing tangle to write a file outside the subtree that holds the .org file being tangled. cheers, Greg ^ permalink raw reply [flat|nested] 49+ messages in thread
* [SECURITY] Tangling can overwrite arbitrary tangling targets, including important user files (was: [SECURITY] Arbitrary code evaluation security in Org) 2023-01-02 10:59 ` [SECURITY] Arbitrary code evaluation security in Org Greg Minshall @ 2023-01-03 9:52 ` Ihor Radchenko 0 siblings, 0 replies; 49+ messages in thread From: Ihor Radchenko @ 2023-01-03 9:52 UTC (permalink / raw) To: Greg Minshall; +Cc: Tom Gillespie, Bastien, Kyle Meyer, emacs-orgmode Greg Minshall <minshall@umich.edu> writes: > one additional item (i don't *think* we discussed this before; apologies > if i'm forgetting): tangling. if one is prompted to "merely" tangle ... > ---- > #+begin_src sh :tangle /var/tmp/foo.org.tangled > echo 'hi!' > #+end_src > ---- > > one could imagine more sinister scenarios for destination, content. > > i don't really know what, how much, to do. possibly just an option, > defaulting to =nil=, allowing tangle to write a file outside the subtree > that holds the .org file being tangled. Good point. Though not directly related to code execution. In this particular case, we might be able to utilize Emacs' file dialogues. For example, `write-file' can ask about overwriting an existing file. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) 2023-01-02 8:34 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Ihor Radchenko 2023-01-02 10:59 ` [SECURITY] Arbitrary code evaluation security in Org Greg Minshall @ 2023-01-02 19:00 ` Tim Cross 2023-01-03 11:00 ` Ihor Radchenko 1 sibling, 1 reply; 49+ messages in thread From: Tim Cross @ 2023-01-02 19:00 UTC (permalink / raw) To: emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > Ihor Radchenko <yantar92@posteo.net> writes: > >> P.S. Considering intense discussion around the topic, what about >> reverting my commit from the release? We can then re-consider the whole >> design and apply something more elaborate later. > > I now reverted the discussed commit. > https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=345402148 > > We need to come up with a uniform security system where all the code > evaluation is (1) easy to control via variables and user queries; (2) > not too annoying for users; (3) provides the necessary context for users > to decide if a code is safe to run. > > Before we continue the discussion, I will try to summarize the current > state of Org manual and code wrt code evaluation of the code coming from > Org documents (including downloaded Org files). > > In the manual we now have > 17.13 Code Evaluation and Security Issues > > This section talks about > > 1. Source block bodies and `org-confirm-babel-evaluate' > 2. shell/elisp links and `org-link-shell-confirm-function' + > `org-link-elisp-confirm-function'. > > Notably, `org-link-elisp-skip-confirm-regexp' is not mentioned in the > manual. > > 3. Table cells, with no way to query or disable execution. > > In reality, we have many more places in the code where arbitrary text > from Org files can be evaluated. > > I have marked some places in the above commit with FIXME. > > From my audit of Org sources the following scenarios may lead to > arbitrary code execution: > > 1. Code block bodies > 2. Elisp sexps in header args. Notably, not only `org-babel-read' is > responsible for evaluating header args. :results and :exports are > evaluated independently. > 3. Table cells > 4. "eval" macros during expansion > 5. Diary sexps > > To the best of my knowledge, this list should be complete. Though I > would appreciate someone double-checking. > > -------------------- > According to the above: > > - `org-confirm-babel-evaluate' allows either using > `org-babel-confirm-evaluate' prompt (when t), not asking at all (when > nil), or using arbitrary prompt function. > - `org-link-shell-confirm-function' + `org-link-elisp-confirm-function' > are similar, except defaulting to `yes-or-no-p'. > - `org-link-elisp-skip-confirm-regexp' extends indiscriminate function > queries to also skip certain (single) regexp. > > The situation is not ideal. > > We have similar, but more detailed system for downloading remote files: > > - `org-safe-remote-resources' allows users to define certain files/urls > that are known to be safe > - `org-resource-download-policy' provides choice between "always query", > "query unless safe", "never download", and "always download" > > Also, `org--confirm-resource-safe', unlike `org-babel-confirm-evaluate' > allows manipulating `org-safe-remote-resources' interactively by marking > current URL or URL domain safe for future. > > ------------------------ > What we can do > > 1. Introduce a new customization `org-confirm-evaluate-safe-regexps' > listing regexps that are considered safe or cons cells > (src-body/header-arg/table/macro/diary . regexp) > > 2. Introduce a new customization `org-confirm-evaluate' that can be set > to t/nil/prompt/safe/[function]/[alist]: > - t/safe :: to display default prompt unless the code block in buffer is > marked safe > - prompt :: always ask (the prompt will then not display options to > add current sexp to safe list) > - [function] :: custom function that returns t/safe/prompt/[alist] > - [alist] :: (src-body/header-arg/table/macro/diary/t . > t/safe/prompt/function) > (t . <value>) stands for default value. > > 3. The default prompt will mimic `org--confirm-resource-safe', > additionally accepting Y/N to accept/decline all the evaluation in > current command. > > This system will be used across Org for code evaluation. Old variables > will be supported, but obsoleted. > > WDYT? Hi Ihor, this looks promising. However, there is a lot to be considered here and it requires some thought before any meaningful feedback can be provided. The big challenge here will be in getting sufficient fine grained control that all use cases can be catered for while also providing a high level interface suitable for the 'general' case which is both reasonably easy to understand at the user level and flexible enough for a default configuration. For many users who don't share org files, who work on a single user desktop and who implicitly trust the files they are working with, it is unlikely they want to be bothered by any of this. It should 'just work'. I suspect this is the majority. Others will have some sharing of documents - perhaps in a work group, a class or some form of team activity. The trust here is likely fairly high but perhaps not absolute. There is probably a need for some choice on execution on a per file basis. Finally, there are those org files which are from unknown and therefore untrusted sources - email messages, cloned git repositories, Emacs packages, etc. Most people likely don't want these executed by default and want to be asked or be able to block by default. The point is, we probably need to consider not only what variables are required, but also some infrastructure for managing those variables based on some form of document classification or trust. You touch on this with some of what has been outlined, but it focuses on the original data source. That information can be lost once a file has been retrieved. However, the trust level of that file likely doesn't change just because it now resides 'locally'. I do wonder if the idea of a document classification model and some form of heuristic algorithms to handle default document classification might be useful. The idea is similar to other security systems which classify documents/files and tags those files with their classification whereby other services (email, http, sftp, etc) implement policies which impose restrictions on files based on the tag. While this is a different use case, I do wonder if such idea might help here e.g. the default setting for various variables controlling code execution are set based on the tag of the file, which in turn is set based on the heuristic for that file. For example, *.org files created in Emacs by the user/owner might have the highest 'trust' tag while those which originate in Email or from external links might have the lowest unless the link/source is flagged as trustworthy. We could have a mechanism whereby you define a trust 'tag' which in turn defines the various variables associated with control of code execution. We would then define a mechanism for defining a 'rule' to classify org files, allowing users to define their own heuristics and define a base set of tags and rules which define default behaviour. The tags could be a header variable or an emacs file local variable etc. There could be rules triggered for files opened without a tag or a mechanism defined for a default tag (or perhaps a function which could, as one option, ask the user when the file is first opened and no tag exists etc). Of course, the devil is in the details. For example, how do we handle the case where you and I are sharing a file and we want different tags? (we would likely need some form of simple 'signing' for tags and ability to have multiple tags per file or forced 'review' of tags not originating form the user etc). Somewhat related, if Timothy is reading this thread, I wonder if some questions in the next Emacs survey might be useful (or if an org specific survey would be useful) in order to get some real data on user use patterns and data sources etc. It is possible that the use case for org files with untrusted code is so small that none of this is actually necessary and we could just handle it by making the risks very explicit and leave the user to decide on how they want to mitigate the risks. There is one school of thought which would state that if you are unable to define a reliable and understandable security model which works, your better off just educating the user base and leaving it to them to manage in whatever manner is best suitable for their situation. A model which is hard to understand or which doens't work runs the risk of creating a false sense of security and may do more harm than no model and a big red sticker which says "Beware of the tiger!". ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) 2023-01-02 19:00 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Tim Cross @ 2023-01-03 11:00 ` Ihor Radchenko 2023-01-07 13:12 ` Ihor Radchenko 0 siblings, 1 reply; 49+ messages in thread From: Ihor Radchenko @ 2023-01-03 11:00 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-orgmode Tim Cross <theophilusx@gmail.com> writes: >> 1. Introduce a new customization `org-confirm-evaluate-safe-regexps' >> listing regexps that are considered safe or cons cells >> (src-body/header-arg/table/macro/diary . regexp) >> >> 2. Introduce a new customization `org-confirm-evaluate' that can be set >> to t/nil/prompt/safe/[function]/[alist]: >> - t/safe :: to display default prompt unless the code block in buffer is >> marked safe >> - prompt :: always ask (the prompt will then not display options to >> add current sexp to safe list) >> - [function] :: custom function that returns t/safe/prompt/[alist] >> - [alist] :: (src-body/header-arg/table/macro/diary/t . >> t/safe/prompt/function) >> (t . <value>) stands for default value. >> >> 3. The default prompt will mimic `org--confirm-resource-safe', >> additionally accepting Y/N to accept/decline all the evaluation in >> current command. >> >> This system will be used across Org for code evaluation. Old variables >> will be supported, but obsoleted. >> >> WDYT? > > For many users who don't share org files, who work on a single user > desktop and who implicitly trust the files they are working with, it is > unlikely they want to be bothered by any of this. It should 'just > work'. I suspect this is the majority. Others will have some sharing of > documents - perhaps in a work group, a class or some form of team > activity. The trust here is likely fairly high but perhaps not > absolute. There is probably a need for some choice on execution on a per > file basis. Finally, there are those org files which are from unknown > and therefore untrusted sources - email messages, cloned git > repositories, Emacs packages, etc. Most people likely don't want these > executed by default and want to be asked or be able to block by default. > The point is, we probably need to consider not only what variables are > required, but also some infrastructure for managing those variables > based on some form of document classification or trust. You touch on > this with some of what has been outlined, but it focuses on the original > data source. That information can be lost once a file has been > retrieved. However, the trust level of that file likely doesn't change > just because it now resides 'locally'. Oops. I think I forgot to describe another point I was thinking about. REGEXP in `org-confirm-evaluate-safe-regexps' may also be a cons cell (SOURCE . REGEXP). SOURCE can be a file path, a directory containing the file, or file contents hash. This way, we can mark whole files or directories as safe. Or just specific code blocks in files or directories. > I do wonder if the idea of a document classification model and some form > of heuristic algorithms to handle default document classification might > be useful. I do not think that we need to go in this direction. I doubt that we are qualified to get the heuristics right. Such things should either be maintained in Emacs core or not provided at all to not create false sense of security. Look at Emacs' approach to file-local variables. There are no heuristics there. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) 2023-01-03 11:00 ` Ihor Radchenko @ 2023-01-07 13:12 ` Ihor Radchenko 0 siblings, 0 replies; 49+ messages in thread From: Ihor Radchenko @ 2023-01-07 13:12 UTC (permalink / raw) To: Tim Cross; +Cc: emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: >> I do wonder if the idea of a document classification model and some form >> of heuristic algorithms to handle default document classification might >> be useful. > > I do not think that we need to go in this direction. > I doubt that we are qualified to get the heuristics right. > Such things should either be maintained in Emacs core or not provided at > all to not create false sense of security. And I was wrong. There is `unsafep' and `safe-functions' customization, which we can utilize. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-31 13:48 ` Ihor Radchenko 2022-12-31 16:15 ` Tom Gillespie 2023-01-02 8:34 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Ihor Radchenko @ 2023-01-02 15:13 ` Bastien Guerry 2023-01-02 15:17 ` Ihor Radchenko 2 siblings, 1 reply; 49+ messages in thread From: Bastien Guerry @ 2023-01-02 15:13 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Tom Gillespie, Kyle Meyer, emacs-orgmode Ihor Radchenko <yantar92@posteo.net> writes: > We may, however, make `org-confirm-babel-evaluate' function value accept > an extra third argument - context ('code or 'vars). This will retain the > required flexibility without introducing an extra variable. Yes, this is an interesting possibility. > P.S. Considering intense discussion around the topic, what about > reverting my commit from the release? We can then re-consider the whole > design and apply something more elaborate later. I see you did the revert already: this is fine by me. Thanks, -- Bastien ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2023-01-02 15:13 ` [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable Bastien Guerry @ 2023-01-02 15:17 ` Ihor Radchenko 0 siblings, 0 replies; 49+ messages in thread From: Ihor Radchenko @ 2023-01-02 15:17 UTC (permalink / raw) To: Bastien Guerry; +Cc: Tom Gillespie, Kyle Meyer, emacs-orgmode Bastien Guerry <bzg@gnu.org> writes: > Ihor Radchenko <yantar92@posteo.net> writes: > >> We may, however, make `org-confirm-babel-evaluate' function value accept >> an extra third argument - context ('code or 'vars). This will retain the >> required flexibility without introducing an extra variable. > > Yes, this is an interesting possibility. See my other email where I suggested a more elaborate approach. >> P.S. Considering intense discussion around the topic, what about >> reverting my commit from the release? We can then re-consider the whole >> design and apply something more elaborate later. > > I see you did the revert already: this is fine by me. 👍 -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-30 17:43 ` Tom Gillespie 2022-12-31 13:48 ` Ihor Radchenko @ 2023-01-02 15:15 ` Bastien 1 sibling, 0 replies; 49+ messages in thread From: Bastien @ 2023-01-02 15:15 UTC (permalink / raw) To: Tom Gillespie; +Cc: Ihor Radchenko, Kyle Meyer, emacs-orgmode Hi Tom, thanks a lot for the detailed explanations: I get your point and I understand the need. I think the revert is a good move, though, as the solution was not really good enough. Thanks! -- Bastien ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-12 10:20 ` Ihor Radchenko 2022-12-13 1:53 ` Tom Gillespie @ 2022-12-13 4:16 ` Kyle Meyer 1 sibling, 0 replies; 49+ messages in thread From: Kyle Meyer @ 2022-12-13 4:16 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Tom Gillespie, Bastien, emacs-orgmode Ihor Radchenko writes: > I am also wondering if we should include this into bugfix. > This is a new feature, but it appears to be important enough to be > merged into built-in Org. > Bastien, Kyle, any thoughts? Sounds reasonable to me. ^ permalink raw reply [flat|nested] 49+ messages in thread
* Re: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable 2022-12-11 20:27 ` Tom Gillespie 2022-12-11 20:37 ` Tom Gillespie 2022-12-11 20:46 ` Kyle Meyer @ 2022-12-13 16:15 ` Max Nikulin 2 siblings, 0 replies; 49+ messages in thread From: Max Nikulin @ 2022-12-13 16:15 UTC (permalink / raw) To: emacs-orgmode On 12/12/2022 03:27, Tom Gillespie wrote: > > #+begin_src elisp :results none > (setq-local > org-confirm-babel-evaluate-cell > (lambda (lang body) > (ignore lang) > (let ((rb (read body))) > (not ; aka (unless condition t) > (or > (member rb > '((or) > (and) > ;; add more forms that are known safe here > )) Thank you, Tom. At first I thought you managed to define a function that treats particular directories as safe (to discriminate own files and files having non-trusted origins). However in such case you would not need additional user option and `org-confirm-babel-evaluate' would be enough. Walking through the passed expression to prove that it has no side effects is an interesting and challenging problem. And frankly speaking, I was confused and believed that it is responsibility of the new function to issue e.g. `yes-or-no-p' prompt. Now I see that it is `org-babel-confirm-evaluate' that shows such prompt. ^ permalink raw reply [flat|nested] 49+ messages in thread
end of thread, other threads:[~2023-01-07 13:12 UTC | newest] Thread overview: 49+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-12-10 20:28 [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable Tom Gillespie 2022-12-11 2:58 ` Max Nikulin 2022-12-11 20:27 ` Tom Gillespie 2022-12-11 20:37 ` Tom Gillespie 2022-12-11 20:46 ` Kyle Meyer 2022-12-11 21:08 ` Tom Gillespie 2022-12-12 10:20 ` Ihor Radchenko 2022-12-13 1:53 ` Tom Gillespie 2022-12-13 9:03 ` Ihor Radchenko 2022-12-13 16:31 ` Max Nikulin 2022-12-13 21:16 ` Tom Gillespie 2022-12-14 16:40 ` Max Nikulin 2022-12-14 18:24 ` Tom Gillespie 2022-12-15 9:18 ` Ihor Radchenko 2022-12-15 9:25 ` Tom Gillespie 2022-12-15 9:57 ` tomas 2022-12-15 9:10 ` Ihor Radchenko 2022-12-15 12:10 ` Max Nikulin 2022-12-15 12:25 ` Ihor Radchenko 2022-12-15 14:46 ` Max Nikulin 2022-12-15 21:08 ` Tim Cross 2022-12-16 6:07 ` Ihor Radchenko 2022-12-16 7:22 ` Tim Cross 2022-12-18 14:19 ` Ihor Radchenko 2022-12-18 21:37 ` Tim Cross 2022-12-20 0:00 ` Tom Gillespie 2022-12-20 0:06 ` Tom Gillespie 2022-12-25 11:00 ` Ihor Radchenko 2022-12-18 14:12 ` Ihor Radchenko 2022-12-25 11:06 ` Ihor Radchenko 2022-12-29 15:58 ` Bastien Guerry 2022-12-29 16:33 ` Max Nikulin 2022-12-29 16:35 ` Ihor Radchenko 2022-12-30 8:52 ` Bastien 2022-12-30 11:10 ` Max Nikulin 2022-12-30 17:43 ` Tom Gillespie 2022-12-31 13:48 ` Ihor Radchenko 2022-12-31 16:15 ` Tom Gillespie 2023-01-02 8:34 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Ihor Radchenko 2023-01-02 10:59 ` [SECURITY] Arbitrary code evaluation security in Org Greg Minshall 2023-01-03 9:52 ` [SECURITY] Tangling can overwrite arbitrary tangling targets, including important user files (was: [SECURITY] Arbitrary code evaluation security in Org) Ihor Radchenko 2023-01-02 19:00 ` [SECURITY] Arbitrary code evaluation security in Org (was: [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable) Tim Cross 2023-01-03 11:00 ` Ihor Radchenko 2023-01-07 13:12 ` Ihor Radchenko 2023-01-02 15:13 ` [PATCH] ob-core: add org-confirm-babel-evaluate-cell custom variable Bastien Guerry 2023-01-02 15:17 ` Ihor Radchenko 2023-01-02 15:15 ` Bastien 2022-12-13 4:16 ` Kyle Meyer 2022-12-13 16:15 ` Max Nikulin
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).