Fix remotely exploitable stack overrun in Milliwatt
authorMatthew Jordan <mjordan@digium.com>
Thu, 15 Mar 2012 18:55:54 +0000 (18:55 +0000)
committerMatthew Jordan <mjordan@digium.com>
Thu, 15 Mar 2012 18:55:54 +0000 (18:55 +0000)
Milliwatt is vulnerable to a remotely exploitable stack overrun when using
the 'o' option.  This occurs due to the milliwatt_generate function not
accounting for AST_FRIENDLY_OFFSET when calculating the maximum number of
samples it can put in the output buffer.

This patch resolves this issue by taking into account AST_FRIENDLY_OFFSET
when determining the maximum number of samples allowed.  Note that at no
point is remote code execution possible.  The data that is written into the
buffer is the pre-defined Milliwatt data, and not custom data.

(closes issue ASTERISK-19541)
Reported by: Russell Bryant
Tested by: Matt Jordan
Patches:
  milliwatt_stack_overrun.rev1.txt by Russell Bryant (license 6283)
  Note that this patch was written by Russell, even though Matt uploaded it
........

Merged revisions 359645 from http://svn.asterisk.org/svn/asterisk/branches/1.6.2
........

Merged revisions 359656 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 359694 from http://svn.asterisk.org/svn/asterisk/branches/10

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@359704 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_milliwatt.c

index 4214141..75d8037 100644 (file)
@@ -78,7 +78,7 @@ static void milliwatt_release(struct ast_channel *chan, void *data)
 static int milliwatt_generate(struct ast_channel *chan, void *data, int len, int samples)
 {
        unsigned char buf[AST_FRIENDLY_OFFSET + 640];
 static int milliwatt_generate(struct ast_channel *chan, void *data, int len, int samples)
 {
        unsigned char buf[AST_FRIENDLY_OFFSET + 640];
-       const int maxsamples = ARRAY_LEN(buf);
+       const int maxsamples = ARRAY_LEN(buf) - (AST_FRIENDLY_OFFSET / sizeof(buf[0]));
        int i, *indexp = (int *) data;
        struct ast_frame wf = {
                .frametype = AST_FRAME_VOICE,
        int i, *indexp = (int *) data;
        struct ast_frame wf = {
                .frametype = AST_FRAME_VOICE,