On Wed, Mar 16, 2011 at 01:33:24PM -0500, Tilghman Lesher wrote:
> On Wednesday 16 March 2011 13:14:40 Vinícius Fontes wrote:
> > action: command
> > command: ! /bin/ls -l /
> 
> For security reasons, you cannot do this.  This is intentional, not a bug.
> Consider the command 'rm -rf /' for the reason why.

I would not call this "security reasons". '!' does not run a shell
command by the Asterisk host. It allows the remoet Asterisk guest to
escape to a shell.

You might as well have run 'system("rm -rf /")' on the local client
connecting to the manager interface.

        if (s[0] == '!') {
                if (s[1])
                        ast_safe_system(s+1);
                else
                        ast_safe_system(getenv("SHELL") ?
getenv("SHELL") : "/bin/sh");
        } else
                ast_cli_command(STDOUT_FILENO, s);

I'm root. Asterisk runs as user asterisk. '!' runs commands as user
root.

sweetmorn:~# id -a
uid=0(root) gid=0(root) groups=0(root)
sweetmorn:~# ps u `cat /var/run/asterisk/asterisk.pid `
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
asterisk 24280  0.6  0.6 122312 12620 ?        Ssl  13:25   0:00 /usr/sbin/aster

sweetmorn:~# asterisk -r
[snip]
sweetmorn*CLI> !id -a
uid=0(root) gid=0(root) groups=0(root)




Asterisk does have an extra check for manager commands that may
potentially allow a remote user to inject a system command:

  /* To run the System application (or anything else that goes to shell), you 
must have the additional System privilege */
  if (!(s->session->writeperm & EVENT_FLAG_SYSTEM)
          && (
                  strcasestr(app, "system") ||      /* System(rm -rf /)
                                                       TrySystem(rm -rf /)      
 */
                  strcasestr(app, "exec") ||        /* Exec(System(rm -rf /)) 
TryExec(System(rm -rf /)) */
                  strcasestr(app, "agi") ||         /* AGI(/bin/rm,-rf /)
                                                       EAGI(/bin/rm,-rf /)      
 */
                  strstr(appdata, "SHELL") ||       /* NoOp(${SHELL(rm -rf /)}) 
 */
                  strstr(appdata, "EVAL")           /* 
NoOp(${EVAL(${some_var_containing_SHELL})}) */
                  )) {
          astman_send_error(s, m, "Originate with certain 'Application' 
arguments requires the additional System privilege, which
you do not have.");

So indeed 'write=command' was not enough here. write='command,system' is
more like it. If you know what you're doing (or have a system to play
with, or whatever).


Also note that if you run Asterisk as a non-root user, system() will not
make the code magically run as root. Did I mention you should avoid
running Asterisk as root?

-- 
               Tzafrir Cohen
icq#16849755              jabber:[email protected]
+972-50-7952406           mailto:[email protected]
http://www.xorcom.com  iax:[email protected]/tzafrir

--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
New to Asterisk? Join us for a live introductory webinar every Thurs:
               http://www.asterisk.org/hello

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to