OS Xでは、私の友人が/usr/bin
すべての人に書き込みアクセスを許可するためにFinderの権限を繰り返し変更しました。
これは以下のように達成される。
Finderにアクセスして、/usr/bin
情報ウィンドウの下部にある権限を変更します。
その後はもう実行できませんTerminal.app
。ただし、ターミナルがなくてもディスクユーティリティを実行して修復できます。
この場合に発生するエラーは次のとおりです。
Last login: Fri Jul 4 15:39:24 on ttys001
login(27006,0x7fff78115310) malloc: *** error for object 0x7fceb3412cc0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
幸い、この問題に言及する質問をすぐに見つけました。ここ。
私の最初の考えは、これがハードウェアの問題(おそらくハードドライブ/ RAM /などの任意の損傷)でした。
このエラーは、誤った権限とどのような関係がありますか/usr/bin
?
明確な違いのリストを得るために破損したシステムで作業しようとすると、次のような結果が得られました。
$ sudo -s
sudo: effective uid is not 0, is sudo installed setuid root?
結果は次のとおりですdiskutil verifyPermissions
(しかし問題は解決しました)。
(あまりカーソルはここに投稿できません)
各行の形式は次のとおりです。
Permissions differ on "usr/bin/sudo"; should be -r-s--x--x ; they are -rwxr-xrwx
しかし、ファイル名、ファイルが持っている必要がある権限、現在の権限だけが残りました。
Permissions differ on "usr/bin/login"; should be -r-sr-xr-x ; they are -rwxr-xrwx
答え1
問題は、実際にFinderが権限を変更する方法が想像できるインジケータビット以上の影響を与えることです。何らかの理由でファイルモードの最初のオクテットをクリアし、実行可能ビットを変更しないでください。その結果、いくつかの重要なプログラムがsetuid/setgid
そしてsticky
削除されたビットは役に立たないか誤動作します。
/usr/bin/
Windowsの一部のプログラムは通常のプログラムより低いレベルでシステムと対話する必要があるため、setuidビットが必要です。たとえば、、、sudo
またははpasswd
一般ユーザー権限以上の権限が必要なためnewgrp
、login
実行するにはパスワードが必要です。対応する setuid ビットが削除されると、その操作を実行できなくなり、早期に終了したりクラッシュしたりする可能性があります。
たとえば、正しい権限/usr/bin/login
は4555
またはで-r-sr-xr-x
、友人の仕事の後は0757
またはです-rwxr-xrwx
。これターミナルプログラム/usr/bin/login
ユーザーをtty呼び出しに関連付けます(参照:man stty
)setuidビットが欠落して失敗します。割り当てられていないポインタを解放することは、それに関連するバグかもしれません。 OS X 10.6.8ではこのポインタエラーは発生しませんが、ターミナルプログラム開始するとすぐに終了しましたが、似たようなlogin[6647]: pam_open_session(): system error
項目が見つかりました/var/log/system.log
。
編集する。Antoine Lecailleがコメントで述べたように、Terminal.appを正しく機能させないようにする簡単な方法は$ sudo chmod -s /usr/bin/login
ログイン呼び出しに依存しているため、後で新しいウィンドウを開くこともできないことに注意してください。元に戻すには、を実行します$ sudo chmod +s /usr/bin/login
。
以下のように、Finderが権限に与える影響をテストしました。
$ # create a directory with the same permissions as /usr/bin
$ mkdir -m 755 test
$ sudo chown root:wheel test
$ ls -l | grep test
drwxr-xr-x 2 root wheel 68 Jul 6 15:01 test
$ # create 4096 empty files with all possible permissions
$ cd test
$ sudo touch file_{0..7}{0..7}{0..7}{0..7}
$ for perms in {0..7}{0..7}{0..7}{0..7}; do sudo chmod $perms file_$perms; done
速度が遅いため、ループをfor
完了するのに1分かかることがありますchmod
。その後、フォルダにfile_wxyz
権限を持つファイルがあります。例えばwxyz
test
$ ls -l file_4555
-r-sr-xr-x 1 root wheel 0 Jul 6 15:02 file_4555
$ open .
友だちのスタントをコピーし、Finder:とCmd+を使用してフォルダとすべてのコンテンツの権限を変更し、投稿の説明に従ってI実行できます。私はグループホイールの読み取り権限とすべての人に読み取り+書き込み権限を付与することにしました。
それでは、ファイルに何が起こるのかを見てみましょう。次のパイプラインはディレクトリを一覧表示し、権限を含む列を読み取り、それらを並べ替え、重複行を抑制します。
$ ls -l | awk '{print $1}' | sort -u
-rw-r--rw-
-rw-r--rwx
-rw-r-xrw-
-rw-r-xrwx
-rwxr--rw-
-rwxr--rwx
-rwxr-xrw-
-rwxr-xrwx
total
$ ls -l file_4555
-rwxr-xrwx 1 root wheel 0 Jul 6 15:02 file_4555
ご覧のとおり、setuid/setgid/sticky ビットは設定されなくなりました。すべてのファイルは同じ読み取りおよび書き込み権限を持ち、実行ビットでのみ権限が異なります(8つの可能な組み合わせがあります)。
答え2
短い答え
/usr/bin
フォルダの権限を変更すると、その権限は変更されないため、/usr/bin
シンボリックリンクの権限が正しく設定されていないため、ポインタがアクセスできないメモリを参照する可能性があります(私が知っているためアクセスできません)。特権質問)。
詳細な回答
/bin – ユーザーバイナリ
- バイナリ実行可能ファイルが含まれています。
- シングルユーザーモードで使用する必要がある一般的なLinuxコマンドは、このディレクトリにあります。
- システムのすべてのユーザーが使用するコマンドはここにあります。
- 例:ps、ls、ping、grep、cp。
これで権限を変更しました/usr/bin
。それでは、シンボリックリンク権限がどのように影響を受けるかを見てみましょう。
シンボリックリンクのファイルシステム権限は通常、リンク自体の名前変更または削除操作にのみ関連し、ターゲットファイル自体の権限によって制御されるターゲットファイルのアクセスモードとは無関係です。
これで、基本ファイルの権限を変更してもシンボリックリンクの権限には影響しないことが明らかになりました。
それでは、このエラーは正確に何を意味しますか?
これは、コードが未使用malloc
/割り当てられたコンテンツを解放しようとしていることを意味しますrealloc
。また、デッドポインタを解放されたメモリに返すのはなぜですか?
上記の観察に基づいて権限を変更した後は、シンボリックリンクを参照できないため、ポインタは無効です(シンボリックリンクに対する適切な権限はありません)。したがって、上記のエラーが発生します。
引用する
https://stackoverflow.com/questions/14575545/pointer-freed-not-allocation https://superuser.com/questions/303040/how-do-file-permissions-apply-to-symlinks https://superuser.com/questions/395035/are-world-read-writable-executable-links-in-usr-bin-security-holes