cross compile bash for openWRT on Rasp Pi 3

refer https://openwrt.org/docs/guide-developer/crosscompile

openWRT source 編譯的時候可以順便編譯出cross compile tool chain

  1. git clone https://git.lede-project.org/source.git
  2. cd source
  3. make menuconfig
  4. enter target system, select BCM27xx
  5. enter subtarget, select BCM2710
  6. check and enter Advanced configuration options (for developers)
    1. check Target Options
    2. check Toolchain Options
    3. keep default in above 2 options
  7. make -j8

以上編譯完成之後會出現 staging_dir/ 這個資料夾

staging_dir/ 資料夾裡面會有四個資料夾

host
packages
target-arm_cortex-a53+neon-vfpv4_musl-1.1.16_eabi
toolchain-arm_cortex-a53+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi

toolchain 就是第四個資料夾了

接著寫個script (~/crosscompile/env.sh)方便設定cross compile 環境變數

export STAGING_DIR=/data2/owenwen/crosscompile/source/staging_dir
export TOOLCHAIN_DIR=$STAGING_DIR/toolchain-arm_cortex-a53+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi
export LDCFLAGS=$TOOLCHAIN_DIR/usr/lib
export LD_LIBRARY_PATH=$TOOLCHAIN_DIR/usr/lib
export PATH=$TOOLCHAIN_DIR/bin:$PATH

然後下載 bash source , configure 的部份

  1. wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
  2. tar zxf bash-4.4.tar.gz
  3. cd bash-4.4
  4. source ~/crosscompile/env.sh
  5. ./configure –build=i686-linux –host=armv7-linux CC=$TOOLCHAIN_DIR/bin/arm-openwrt-linux-gcc CXX=$TOOLCHAIN_DIR/bin/arm-openwrt-linux-g++ –without-bash-malloc
  6. make -j8

build pass 之後就會有一個可以在 openWRT on Rasp PI 3 上面運行的bash 囉!

在沒有加 –without-bash-malloc 之前,運行bash 會看到下面這個錯誤訊息

locale.c:81: cannot allocate 18 bytes

咕狗之後看到docker bash 也有一樣的錯誤訊息並且說明是musl 沒有實做 brk/sbrk 的關係

https://github.com/tianon/docker-bash/blob/master/4.4/Dockerfile

# musl does not implement brk/sbrk (they simply return -ENOMEM)
# bash: xmalloc: locale.c:81: cannot allocate 18 bytes (0 bytes allocated)

 

我也把一份已經編譯好的上傳在google drive bash

refer http://worldend.logdown.com/posts/276005-cross-compile-for-openwrt

How CVE-2014-6271 works

透過下面這篇看懂了~ycombinator除了創業竟然還可以順便解惑…
https://news.ycombinator.com/item?id=8361574

先透過下面這個方式設定一個環境變數
$ export badvar='() { :;}; echo vulnerable’
然後再呼叫bash執行某指令,例如
$ bash -c “pwd"
然後就可以發現原本設定在環境變數裡面分號後面的指令竟然就被執行了…
$ bash -c “pwd"
vulnerable
/home/owen

原因應該是呼叫 bash 的時候,實際上的行為就是 fork 出一個 bash process
並且會設定一次目前現有的環境變數給 fork 出來的子程序
然後在設定環境變數的過程中執行到了badvar=() { :;}; echo vulnerable
然後就順便執行了後面的 echo 指令
不過這好像沒有辦法作到權限提昇,傷害應該有限

change php exec shell to bash

當我們用 php 的 exec 指令,想要叫電腦執行某些指令或者 shell script 時候

可能會遇到問題

因為 exce 使用 /bin/sh 作為執行的環境,而 linux 有可能使用 /bin/sh -> /bin/dash 當作 /bin/sh 來使用

而 dash 沒有 source 這種 shell command,bash 才有。

這是第一個問題

第二個問題:當我rm /bin/sh;sudo ln -s /bin/bash /bin/sh

看起來應該可以讓我的 php 的 exec() 使用 bash 作為執行環境了

但是為什麼動作的結果和我自己在登入電腦之後在 bash 環境下執行的結果不一樣?

例如 source .bashrc ,顯示 file not found

在 sh 的情況下是因為在 PATH 裡面搜尋不到檔案的話, sh 不會到當前目錄再進行搜尋

但是 bash 在 PATH 裡面搜尋不到檔案的話, bash 是會到當前目錄進行搜尋的

BUT,當我把 /bin/sh -> /bin/bash 之後,用 exec 呼叫,他似乎不是這樣運作…what the fuxx …

解法:

exec("/bin/bash -c"source .bashrc" ");

這樣,我解決了我的問題。但我依然不知道 exec 執行的時候用 bash 跟我帳號登入機器執行 bash 為什麼會不一樣!