ウェブカメラが使用されているかどうかを知る方法は?


14

ウェブカメラが使用されているかどうかを確認できるコマンドはどれですか?

lsof /dev/video0十分ではありません。メジャー番号とマイナー番号が81と0のすべてのブロックデバイスを監視する必要があります。


2
+1。TIL lsof(およびfuser)は、デフォルトでは必要なことを行いません。
セラダ

@celada教えてください。
YoungFrog

あなたの懸念は何ですか?それはあなたを見ているビデオですか、それともオーディオも心配ですか(その場合、レンズをカバーしても問題は解決しません)?それとも、デバッグに関することですか、それとも好奇心ですか?#
クリスH

@YoungFrogこの質問のOPをほめたたきました。最初は、それを開くために使用されたファイルシステムパスに関係なくlsof /dev/video0/dev/video0参照するカーネルvfsオブジェクトに接続されたオープンファイル記述子を保持しているすべてのプロセスが必要だと思っていましたが、OPの質問はこれが真実ではないことを明らかにしています。
セラダ

回答:


14

カーネルがモジュールを使用している場合(可能性が高い)、プログラムがWebカメラにアクセスしているかどうかを判断する1つの方法は、モジュールの使用数を調べることです。

$ lsmod | grep uvcvideo
uvcvideo               90112  0

3番目のフィールドの0は、-制御されたuvcvideoWebカメラ(実行時lsmod)に対して開いているデバイスがないことを示します。もちろん、どのモジュールがウェブカメラの原因であるかを正確に知る必要があります。ただし、チェックするのは簡単です。チーズなどのプログラムを実行しているときに出力が変化するのがわかります。

厳密に言えば、正の数はデバイスが開かれたことを意味するだけであり、画像がキャプチャされていることを意味するものではないことに注意してください。


また、正の数は、何かがそのようなデバイスを現在開いていることを意味するだけではなく、イメージをキャプチャしてから閉じるためにほんの一瞬開いているかもしれませんか?そのような使用パターンでは、実際にそれをキャッチするために信じられないほど幸運でなければなりません。
CVn

@MichaelKjörlingだから「lsmod走ったとき」と言った。あなたが与えたシナリオを考えると、それは拡張に値します(私の経験では、カメラのレイテンシはデバイスを開き、画像をキャプチャし、デバイスを閉じるのにかなり時間がかかります)。ただし、同じ問題を使用して、fuserまたはlsof同じ問題に悩まされているデバイスの使用状況を確認します。より堅牢なアプローチでは、トレースポイントなどを使用してV4L APIをフックする必要があります。
スティーブンキット

@MichaelKjörling確かに。この使用パターンをキャプチャするには、ある時点でチェックするだけでなく、デバイスファイルへのアクセスを監視する必要があります。
ジル「SO-悪であるのをやめる」

7

あなたが実際に望んでいるのは、望んでいないときにあなたのウェブカメラが使用されていないことを確認することであると仮定すると、最も簡単な解決策は不要なときに(外部の場合)単純に切断することです。または、ウェブカメラを覆う(ダクトテープが1枚あれば機能します)。

物理ベースのアプローチは、ソフトウェアのアプローチよりもはるかに安全です。


1
テープはマイクをブロックしません。マイクは(内蔵のWebカメラでも)サウンドモジュールではなくカメラの一部として構成できます。
クリスH

ダクトテープは、残留物を簡単に残す可能性があるため、強くお勧めします。手術用テープ(ドラッグストアから入手可能)を使用しました。これは、レンズを覆う小さなステッカーで、粘着面から粘着面まで、除去時に残留物がほとんど残らないためです。そうすれば、レンズに糊残りのリスクがありません。確かに、それはわずかに永続的な解決策です。常にテープをはずしてテープに戻す必要はありません。
CVn

意味をなさない@ChrisH(皮肉なことに、トップSEは英語です...)どういう意味ですか?
theonlygusti

@theonlygusti私はハードウェアの一部としてモジュールを意味しました。もちろん、このスレッドでは、ソフトウェアを意味するものとして読む方が論理的であり、あまり意味がありません。テープはマイクをブロックしません。マイクは、サウンドカードを介して接続されているものの代わりに、またはそれに加えて、Webカメラハードウェアの一部にすることができます(SoCハードウェアのために避けていた用語)。そのため、Webカメラが有効/アクティブ/スパイであるかどうかを判断するには、レンズだけでなくそれ以上のことを心配するかもしれません。しかし、私がここに持っている唯一のLinuxシステムはChromebook(クルトン)なので、少し制限されています。
クリスH

1
確かに、それは問題ではありませんでした
ジル「SO-悪であるのを止めてください」

7

健全なシステムでは、独自のchrootsをセットアップしていない限り/dev、すべてのデバイスファイルはの下にあり/devます。デバイスファイルを作成できるのはrootのみであるため、悪意のあるユーザーが他の場所でデバイスファイルを作成することを心配する必要はありません。

そのため、必要なのは、/dev目的のデバイスと同じデバイスを参照するファイルを見つけることだけです。

ls -lR /dev |awk '/^c/ && $5 == "81," && $6 == "0"'

これはのみを表示する可能性があり/dev/video0ます。通常、各デバイスには1つのデバイスファイルがあり、場合によっては追加のシンボリックリンクがあります。

したがって、あなたの質問に対する実際的な答えは簡単なものです。デバイスファイルを開いているプロセスを確認してください。

fuser /dev/video0

アクセスを監視する(つまり、デバイスファイルをいつでも開く可能性のあるプロセスをキャッチする)場合は、デバイスファイルでLinuxのファイルアクセス監視方法のいずれかを使用します。監視を設定しますファイルが開いています)

inotifywait -m -e open,close /dev/video0 &
sleep 1; fuser /dev/video0   # check for processes that have already opened the device

または、システムログにアクセスを記録する監査ルールを設定します(通常/var/log/audit/audit.log

auditctl -w path=/dev/video0 &
sleep 1; fuser /dev/video0   # check for processes that have already opened the device

いい視点ね!しかし、それでもAngel!のソリューションの特定時点の問題に悩まされています(コメントを参照)。最も堅牢なソフトウェアソリューションは、おそらくudev起動時にデバイスファイルを取得しないようにそのデバイスをブラックリストに登録することです。そして、カメラを使用する予定の場合にデバイスファイルを追加します...または物理的にプラグを抜きます。
jpaugh

@jpaugh問題は、Webカメラを無効にするのではなく、Webカメラを使用してプロセスを見つけることでした。
ジル 'SO-悪であるのをやめる'

カーネルレベルで監視する必要があります。デバイスはどこにでも追加できます。たとえばmknod /root/video0 b 81 0
user123456

@ j658063.mvrht.comしかし、それを行うことができるのはルートだけです。rootが愚かなことをしなければ、安全です。rootが馬鹿げたことをすると、とにかくねじ込まれます— rootはカーネルを変更して、いくつかのプロセスを隠すこともできます。
ジル「SO-悪であるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.