Ensure builtin command is run under pathological circumstances

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP












1















Given a hostile environment such as:



for word in builtin command type unfunction declare set unset alias; do
eval "$word() echo $word function; ; alias $word='echo $word alias'"
done


Is it possible to access a builtin command? Eg, is it possible to do something like:



command builtin type echo


and still see:



echo is a shell builtin


Is possible for a hostile (or locked-down) environment to be able to completely redefine things such that an underlying builtin, function or pathname could never be accessed?










share|improve this question
























  • unalias builtin; unset -f builtin? I don't think this environment is hostile enough.

    – Michael Homer
    Jan 29 at 2:54











  • @MichaelHomer I like your sense of evil, and have updated with eval.

    – Tom Hale
    Jan 29 at 3:48















1















Given a hostile environment such as:



for word in builtin command type unfunction declare set unset alias; do
eval "$word() echo $word function; ; alias $word='echo $word alias'"
done


Is it possible to access a builtin command? Eg, is it possible to do something like:



command builtin type echo


and still see:



echo is a shell builtin


Is possible for a hostile (or locked-down) environment to be able to completely redefine things such that an underlying builtin, function or pathname could never be accessed?










share|improve this question
























  • unalias builtin; unset -f builtin? I don't think this environment is hostile enough.

    – Michael Homer
    Jan 29 at 2:54











  • @MichaelHomer I like your sense of evil, and have updated with eval.

    – Tom Hale
    Jan 29 at 3:48













1












1








1


1






Given a hostile environment such as:



for word in builtin command type unfunction declare set unset alias; do
eval "$word() echo $word function; ; alias $word='echo $word alias'"
done


Is it possible to access a builtin command? Eg, is it possible to do something like:



command builtin type echo


and still see:



echo is a shell builtin


Is possible for a hostile (or locked-down) environment to be able to completely redefine things such that an underlying builtin, function or pathname could never be accessed?










share|improve this question
















Given a hostile environment such as:



for word in builtin command type unfunction declare set unset alias; do
eval "$word() echo $word function; ; alias $word='echo $word alias'"
done


Is it possible to access a builtin command? Eg, is it possible to do something like:



command builtin type echo


and still see:



echo is a shell builtin


Is possible for a hostile (or locked-down) environment to be able to completely redefine things such that an underlying builtin, function or pathname could never be accessed?







bash shell zsh






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 29 at 3:48







Tom Hale

















asked Jan 29 at 2:37









Tom HaleTom Hale

7,02833797




7,02833797












  • unalias builtin; unset -f builtin? I don't think this environment is hostile enough.

    – Michael Homer
    Jan 29 at 2:54











  • @MichaelHomer I like your sense of evil, and have updated with eval.

    – Tom Hale
    Jan 29 at 3:48

















  • unalias builtin; unset -f builtin? I don't think this environment is hostile enough.

    – Michael Homer
    Jan 29 at 2:54











  • @MichaelHomer I like your sense of evil, and have updated with eval.

    – Tom Hale
    Jan 29 at 3:48
















unalias builtin; unset -f builtin? I don't think this environment is hostile enough.

– Michael Homer
Jan 29 at 2:54





unalias builtin; unset -f builtin? I don't think this environment is hostile enough.

– Michael Homer
Jan 29 at 2:54













@MichaelHomer I like your sense of evil, and have updated with eval.

– Tom Hale
Jan 29 at 3:48





@MichaelHomer I like your sense of evil, and have updated with eval.

– Tom Hale
Jan 29 at 3:48










1 Answer
1






active

oldest

votes


















3














With Bash, if you enable POSIX mode:




  1. Function names may not be the same as one of the POSIX special builtins.

  2. POSIX special builtins are found before shell functions during command lookup.



Since set and unset are special builtins, you can get access to them via the POSIX mode, and then use those to get rid of the functions, and then use unalias to get rid of the aliases:



$ for word in builtin command type declare set unset unalias alias; do eval "$word() echo $word function; ; alias $word='echo $word alias'"; done 
alias function
$ unalias builtin command type unfunction declare set unset alias
unalias alias builtin command type unfunction declare set unset alias
$ POSIXLY_CORRECT=1
$ unset -f builtin command type declare set unset unalias alias
$ unalias builtin command type unfunction declare set unset alias
bash: unalias: unfunction: not found
bash: unalias: alias: not found

$ type -a builtin
builtin is a shell builtin



But I can't think of a way back from, say:



enable -n set unset builtin command type declare unalias alias typeset enable shopt


(Without trying to start a new shell, which maybe disallowed in a restricted shell.)






share|improve this answer






















    Your Answer








    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "106"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f497327%2fensure-builtin-command-is-run-under-pathological-circumstances%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    With Bash, if you enable POSIX mode:




    1. Function names may not be the same as one of the POSIX special builtins.

    2. POSIX special builtins are found before shell functions during command lookup.



    Since set and unset are special builtins, you can get access to them via the POSIX mode, and then use those to get rid of the functions, and then use unalias to get rid of the aliases:



    $ for word in builtin command type declare set unset unalias alias; do eval "$word() echo $word function; ; alias $word='echo $word alias'"; done 
    alias function
    $ unalias builtin command type unfunction declare set unset alias
    unalias alias builtin command type unfunction declare set unset alias
    $ POSIXLY_CORRECT=1
    $ unset -f builtin command type declare set unset unalias alias
    $ unalias builtin command type unfunction declare set unset alias
    bash: unalias: unfunction: not found
    bash: unalias: alias: not found

    $ type -a builtin
    builtin is a shell builtin



    But I can't think of a way back from, say:



    enable -n set unset builtin command type declare unalias alias typeset enable shopt


    (Without trying to start a new shell, which maybe disallowed in a restricted shell.)






    share|improve this answer



























      3














      With Bash, if you enable POSIX mode:




      1. Function names may not be the same as one of the POSIX special builtins.

      2. POSIX special builtins are found before shell functions during command lookup.



      Since set and unset are special builtins, you can get access to them via the POSIX mode, and then use those to get rid of the functions, and then use unalias to get rid of the aliases:



      $ for word in builtin command type declare set unset unalias alias; do eval "$word() echo $word function; ; alias $word='echo $word alias'"; done 
      alias function
      $ unalias builtin command type unfunction declare set unset alias
      unalias alias builtin command type unfunction declare set unset alias
      $ POSIXLY_CORRECT=1
      $ unset -f builtin command type declare set unset unalias alias
      $ unalias builtin command type unfunction declare set unset alias
      bash: unalias: unfunction: not found
      bash: unalias: alias: not found

      $ type -a builtin
      builtin is a shell builtin



      But I can't think of a way back from, say:



      enable -n set unset builtin command type declare unalias alias typeset enable shopt


      (Without trying to start a new shell, which maybe disallowed in a restricted shell.)






      share|improve this answer

























        3












        3








        3







        With Bash, if you enable POSIX mode:




        1. Function names may not be the same as one of the POSIX special builtins.

        2. POSIX special builtins are found before shell functions during command lookup.



        Since set and unset are special builtins, you can get access to them via the POSIX mode, and then use those to get rid of the functions, and then use unalias to get rid of the aliases:



        $ for word in builtin command type declare set unset unalias alias; do eval "$word() echo $word function; ; alias $word='echo $word alias'"; done 
        alias function
        $ unalias builtin command type unfunction declare set unset alias
        unalias alias builtin command type unfunction declare set unset alias
        $ POSIXLY_CORRECT=1
        $ unset -f builtin command type declare set unset unalias alias
        $ unalias builtin command type unfunction declare set unset alias
        bash: unalias: unfunction: not found
        bash: unalias: alias: not found

        $ type -a builtin
        builtin is a shell builtin



        But I can't think of a way back from, say:



        enable -n set unset builtin command type declare unalias alias typeset enable shopt


        (Without trying to start a new shell, which maybe disallowed in a restricted shell.)






        share|improve this answer













        With Bash, if you enable POSIX mode:




        1. Function names may not be the same as one of the POSIX special builtins.

        2. POSIX special builtins are found before shell functions during command lookup.



        Since set and unset are special builtins, you can get access to them via the POSIX mode, and then use those to get rid of the functions, and then use unalias to get rid of the aliases:



        $ for word in builtin command type declare set unset unalias alias; do eval "$word() echo $word function; ; alias $word='echo $word alias'"; done 
        alias function
        $ unalias builtin command type unfunction declare set unset alias
        unalias alias builtin command type unfunction declare set unset alias
        $ POSIXLY_CORRECT=1
        $ unset -f builtin command type declare set unset unalias alias
        $ unalias builtin command type unfunction declare set unset alias
        bash: unalias: unfunction: not found
        bash: unalias: alias: not found

        $ type -a builtin
        builtin is a shell builtin



        But I can't think of a way back from, say:



        enable -n set unset builtin command type declare unalias alias typeset enable shopt


        (Without trying to start a new shell, which maybe disallowed in a restricted shell.)







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 29 at 4:48









        OlorinOlorin

        3,3831418




        3,3831418



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Unix & Linux Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f497327%2fensure-builtin-command-is-run-under-pathological-circumstances%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown






            Popular posts from this blog

            Peggy Mitchell

            Palaiologos

            The Forum (Inglewood, California)