Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix shell code injection and merging #2

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

blochberger
Copy link

@blochberger blochberger commented Apr 9, 2020

The previous code used double quotes to surround paths, which still allows environment variables and shell code to be evaluated by the shell. Hence, we use single quotes now, to avoid this problem.

PoC exploit:

#!/bin/sh -eux

POC=$(mktemp -d)
mkdir -p "$POC"
cd "$POC"
git init
git config difftool.Word.cmd '/path/to/WordGit/diff.js "$LOCAL" "$REMOTE"'

# Test case #1
touch '`touch foo`.docx'
git add ./*.docx
test ! -e foo # Will fail if file 'foo' exists (sanity check)
git difftool -t Word --cached
test ! -e foo # Will fail if file 'foo' exists. Oops.
git reset --hard

# Test case #2
touch  "'"'`touch bar`.docx'"'"
git add ./*.docx*
test ! -e bar # Will fail if file 'bar' exists (sanity check)
ls
git difftool -t Word --cached
test ! -e bar # Will fail if file 'bar' exists. Oops.
git reset --hard

# Cleanup
#rm -rf "$POC"

You need to change the path to WordGit. Then you can run it and test the exit code. If the exit code is 1, the exploit worked. If the exit code is 0 the exploit is fixed.

@Gaelan
Copy link
Owner

Gaelan commented Apr 9, 2020

Good catch! Honestly, I'm just happy to see that someone is using this thing.

I think your fix would still allow injection if the filename contained ', though, so we probably need to escape argv somehow.

blochberger added a commit to blochberger/WordGit that referenced this pull request Apr 10, 2020
The previous code used double quotes to surround paths, which still
allows environment variables and shell code to be evaluated by the
shell. Hence, we use single quotes now, to avoid this problem.

PoC exploit:

    #!/bin/sh -eux

    POC=$(mktemp -d)
    mkdir -p "$POC"
    cd "$POC"
    git init
    git config difftool.Word.cmd '/path/to/WordGit/diff.js "$LOCAL" "$REMOTE"'

    # Test case Gaelan#1
    touch '`touch foo`.docx'
    git add ./*.docx
    test ! -e foo # Will fail if file 'foo' exists (sanity check)
    git difftool -t Word --cached
    test ! -e foo # Will fail if file 'foo' exists. Oops.
    git reset --hard

    # Test case Gaelan#2
    touch  "'"'`touch bar`.docx'"'"
    git add ./*.docx*
    test ! -e bar # Will fail if file 'bar' exists (sanity check)
    ls
    git difftool -t Word --cached
    test ! -e bar # Will fail if file 'bar' exists. Oops.
    git reset --hard

    # Cleanup
    #rm -rf "$POC"

You need to change the path to WordGit. Then you can run it and test the
exit code. If the exit code is 1, the exploit worked. If the exit code
is 0 the exploit is fixed.
@blochberger
Copy link
Author

You are correct. I amended my change, so that single quotes in file names are now escaped as well. See also updated PoC.

The previous code used double quotes to surround paths, which still
allows environment variables and shell code to be evaluated by the
shell. Hence, we use single quotes now, to avoid this problem.

PoC exploit:

    #!/bin/sh -eux

    POC=$(mktemp -d)
    mkdir -p "$POC"
    cd "$POC"
    git init
    git config difftool.Word.cmd '/path/to/WordGit/diff.js "$LOCAL" "$REMOTE"'

    # Test case Gaelan#1
    touch '`touch foo`.docx'
    git add ./*.docx
    test ! -e foo # Will fail if file 'foo' exists (sanity check)
    git difftool -t Word --cached
    test ! -e foo # Will fail if file 'foo' exists. Oops.
    git reset --hard

    # Test case Gaelan#2
    touch  "'"'`touch bar`.docx'"'"
    git add ./*.docx*
    test ! -e bar # Will fail if file 'bar' exists (sanity check)
    ls
    git difftool -t Word --cached
    test ! -e bar # Will fail if file 'bar' exists. Oops.
    git reset --hard

    # Cleanup
    #rm -rf "$POC"

You need to change the path to WordGit. Then you can run it and test the
exit code. If the exit code is 1, the exploit worked. If the exit code
is 0 the exploit is fixed.
The merged result was discarded and the remote document was always used
after a merge.
@blochberger
Copy link
Author

I also added a fix for issue #1.

@blochberger blochberger changed the title Fix shell code injection Fix shell code injection and merging Apr 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants