t_asan_global_buffer_overflow.sh revision 1.1
11.1Skamil# $NetBSD: t_asan_global_buffer_overflow.sh,v 1.1 2018/04/04 23:53:26 kamil Exp $ 21.1Skamil# 31.1Skamil# Copyright (c) 2018 The NetBSD Foundation, Inc. 41.1Skamil# All rights reserved. 51.1Skamil# 61.1Skamil# This code is derived from software contributed to The NetBSD Foundation 71.1Skamil# by Siddharth Muralee. 81.1Skamil# 91.1Skamil# Redistribution and use in source and binary forms, with or without 101.1Skamil# modification, are permitted provided that the following conditions 111.1Skamil# are met: 121.1Skamil# 1. Redistributions of source code must retain the above copyright 131.1Skamil# notice, this list of conditions and the following disclaimer. 141.1Skamil# 2. Redistributions in binary form must reproduce the above copyright 151.1Skamil# notice, this list of conditions and the following disclaimer in the 161.1Skamil# documentation and/or other materials provided with the distribution. 171.1Skamil# 181.1Skamil# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 191.1Skamil# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 201.1Skamil# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 211.1Skamil# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 221.1Skamil# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 231.1Skamil# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 241.1Skamil# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 251.1Skamil# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 261.1Skamil# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 271.1Skamil# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 281.1Skamil# POSSIBILITY OF SUCH DAMAGE. 291.1Skamil# 301.1Skamil 311.1SkamilSUPPORT='n' 321.1Skamiltest_target() { 331.1Skamil if uname -m | grep -q "amd64"; then 341.1Skamil SUPPORT='y' 351.1Skamil fi 361.1Skamil 371.1Skamil if uname -m | grep -q "i386"; then 381.1Skamil SUPPORT='y' 391.1Skamil fi 401.1Skamil} 411.1Skamil 421.1Skamilatf_test_case global_buffer_overflow 431.1Skamilglobal_buffer_overflow_head() { 441.1Skamil atf_set "descr" "compile and run \"Global Buffer Overflow example\"" 451.1Skamil atf_set "require.progs" "c++ paxctl" 461.1Skamil} 471.1Skamil 481.1Skamilatf_test_case global_buffer_overflow_profile 491.1Skamilglobal_buffer_overflow_profile_head() { 501.1Skamil atf_set "descr" "compile and run \"Global Buffer Overflow example\" with profiling option" 511.1Skamil atf_set "require.progs" "c++ paxctl" 521.1Skamil} 531.1Skamil 541.1Skamilatf_test_case global_buffer_overflow_pic 551.1Skamilglobal_buffer_overflow_pic_head() { 561.1Skamil atf_set "descr" "compile and run PIC \"Global Buffer Overflow example\"" 571.1Skamil atf_set "require.progs" "c++ paxctl" 581.1Skamil} 591.1Skamil 601.1Skamilatf_test_case global_buffer_overflow_pie 611.1Skamilglobal_buffer_overflow_pie_head() { 621.1Skamil atf_set "descr" "compile and run position independent (PIE) \"Global Buffer Overflow example\"" 631.1Skamil atf_set "require.progs" "c++ paxctl" 641.1Skamil} 651.1Skamil 661.1Skamilatf_test_case global_buffer_overflow32 671.1Skamilglobal_buffer_overflow32_head() { 681.1Skamil atf_set "descr" "compile and run \"Global Buffer Overflow example\" for/in netbsd32 emulation" 691.1Skamil atf_set "require.progs" "c++ paxctl file diff cat" 701.1Skamil} 711.1Skamil 721.1Skamilatf_test_case target_not_supported 731.1Skamiltarget_not_supported_head() 741.1Skamil{ 751.1Skamil atf_set "descr" "Test forced skip" 761.1Skamil} 771.1Skamil 781.1Skamilglobal_buffer_overflow_body() { 791.1Skamil cat > test.cpp << EOF 801.1Skamil#include <stdio.h> 811.1Skamil#include <stdlib.h> 821.1Skamilint arr[5] = {-1}; 831.1Skamilint foo(int index) { arr[index] = 0; } 841.1Skamilint main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);} 851.1SkamilEOF 861.1Skamil c++ -fsanitize=address -o test test.cpp 871.1Skamil paxctl -a test 881.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test 891.1Skamil} 901.1Skamil 911.1Skamilglobal_buffer_overflow_profile_body() { 921.1Skamil cat > test.cpp << EOF 931.1Skamil#include <stdio.h> 941.1Skamil#include <stdlib.h> 951.1Skamilint arr[5] = {-1}; 961.1Skamilint foo(int index) { arr[index] = 0; } 971.1Skamilint main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);} 981.1SkamilEOF 991.1Skamil c++ -fsanitize=address -o test -pg test.cpp 1001.1Skamil paxctl +a test 1011.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test 1021.1Skamil} 1031.1Skamil 1041.1Skamilglobal_buffer_overflow_pic_body() { 1051.1Skamil cat > test.cpp << EOF 1061.1Skamil#include <stdio.h> 1071.1Skamil#include <stdlib.h> 1081.1Skamilint foo(int); 1091.1Skamilint main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);} 1101.1SkamilEOF 1111.1Skamil cat > pic.cpp << EOF 1121.1Skamil#include <stdio.h> 1131.1Skamil#include <stdlib.h> 1141.1Skamilint arr[5] = {-1}; 1151.1Skamilint foo(int index) { arr[index] = 0; } 1161.1SkamilEOF 1171.1Skamil 1181.1Skamil c++ -fPIC -fsanitize=address -shared -o libtest.so pic.cpp 1191.1Skamil c++ -o test test.cpp -fsanitize=address -L. -ltest 1201.1Skamil paxctl +a test 1211.1Skamil 1221.1Skamil export LD_LIBRARY_PATH=. 1231.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test 1241.1Skamil} 1251.1Skamil 1261.1Skamilglobal_buffer_overflow_pie_body() { 1271.1Skamil # check whether this arch supports -pice 1281.1Skamil if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 1291.1Skamil atf_set_skip "c++ -pie not supported on this architecture" 1301.1Skamil fi 1311.1Skamil cat > test.cpp << EOF 1321.1Skamil#include <stdio.h> 1331.1Skamil#include <stdlib.h> 1341.1Skamilint arr[5] = {-1}; 1351.1Skamilint foo(int index) { arr[index] = 0; } 1361.1Skamilint main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);} 1371.1SkamilEOF 1381.1Skamil c++ -fsanitize=address -fpie -pie -o test test.cpp 1391.1Skamil paxctl +a test 1401.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test 1411.1Skamil} 1421.1Skamil 1431.1Skamilglobal_buffer_overflow32_body() { 1441.1Skamil # check whether this arch is 64bit 1451.1Skamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 1461.1Skamil atf_skip "this is not a 64 bit architecture" 1471.1Skamil fi 1481.1Skamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 1491.1Skamil atf_skip "c++ -m32 not supported on this architecture" 1501.1Skamil else 1511.1Skamil if fgrep -q _LP64 ./def32; then 1521.1Skamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 1531.1Skamil fi 1541.1Skamilfi 1551.1Skamil 1561.1Skamil cat > test.cpp << EOF 1571.1Skamil#include <stdio.h> 1581.1Skamil#include <stdlib.h> 1591.1Skamilint arr[5] = {-1}; 1601.1Skamilint foo(int index) { arr[index] = 0; } 1611.1Skamilint main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);} 1621.1SkamilEOF 1631.1Skamil c++ -fsanitize=address -o gbof32 -m32 test.cpp 1641.1Skamil c++ -fsanitize=address -o gbof64 test.cpp 1651.1Skamil file -b ./gbof32 > ./ftype32 1661.1Skamil file -b ./gbof64 > ./ftype64 1671.1Skamil if diff ./ftype32 ./ftype64 >/dev/null; then 1681.1Skamil atf_fail "generated binaries do not differ" 1691.1Skamil fi 1701.1Skamil echo "32bit binaries on this platform are:" 1711.1Skamil cat ./ftype32 1721.1Skamil echo "While native (64bit) binaries are:" 1731.1Skamil cat ./ftype64 1741.1Skamil paxctl +a gbof32 1751.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./gbof32 1761.1Skamil 1771.1Skamil# and another test with profile 32bit binaries 1781.1Skamil cat > test.cpp << EOF 1791.1Skamil#include <stdio.h> 1801.1Skamil#include <stdlib.h> 1811.1Skamilint arr[5] = {-1}; 1821.1Skamilint foo(int index) { arr[index] = 0; } 1831.1Skamilint main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);} 1841.1SkamilEOF 1851.1Skamil c++ -o test -m32 -fsanitize=address -pg test.cpp 1861.1Skamil paxctl +a test 1871.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test 1881.1Skamil} 1891.1Skamil 1901.1Skamiltarget_not_supported_body() 1911.1Skamil{ 1921.1Skamil atf_skip "Target is not supported" 1931.1Skamil} 1941.1Skamil 1951.1Skamilatf_init_test_cases() 1961.1Skamil{ 1971.1Skamil test_target 1981.1Skamil test $SUPPORT = 'n' && { 1991.1Skamil atf_add_test_case target_not_supported 2001.1Skamil return 0 2011.1Skamil } 2021.1Skamil 2031.1Skamil atf_add_test_case global_buffer_overflow 2041.1Skamil atf_add_test_case global_buffer_overflow_profile 2051.1Skamil atf_add_test_case global_buffer_overflow_pic 2061.1Skamil atf_add_test_case global_buffer_overflow_pie 2071.1Skamil atf_add_test_case global_buffer_overflow32 2081.1Skamil # static option not supported 2091.1Skamil # -static and -fsanitize=address can't be used together for compilation 2101.1Skamil # (gcc version 5.4.0 and clang 7.1) tested on April 2nd 2018. 2111.1Skamil} 212