+1. TIL lsof(y fuser) por defecto no hace lo que necesita.
Celada
@celada, ¿podrías explicarlo?
YoungFrog
¿Cuáles son tus preocupaciones? ¿Te está viendo un video o también te preocupa el audio (en cuyo caso cubrir la lente no resolvería tu problema)? ¿O se trata de depuración o incluso curiosidad? #
Chris H
@YoungFrog Estaba felicitando al OP por esta pregunta porque me hizo aprender algo. Inicialmente supuse que lsof /dev/video0le gustaría que todos los procesos que contenían un descriptor de archivo abierto estuvieran conectados al objeto vfs del kernel al que se /dev/video0refiere, sin importar a qué ruta del sistema de archivos se haya utilizado para abrirlo, pero la pregunta del OP deja en claro que esto no es cierto.
Celada
Respuestas:
15
Si su kernel usa módulos (lo cual es muy probable), una forma de determinar si un programa está accediendo a su cámara web es mirar el recuento de uso del módulo:
$ lsmod | grep uvcvideo
uvcvideo 90112 0
El 0 en el tercer campo muestra que nada tiene ningún dispositivo abierto para una uvcvideocámara web controlada (cuando se lsmodejecuta). Por supuesto, necesita saber exactamente qué módulo es responsable de su cámara web; Sin embargo, es fácil de verificar, verá el cambio de salida mientras ejecuta un programa como Cheese.
Tenga en cuenta que, estrictamente hablando, un conteo positivo solo significa que algo ha abierto un dispositivo, no significa que se estén capturando imágenes.
¿Un conteo positivo también solo significa que algo tiene un dispositivo abierto ahora , en lugar de abrirlo durante una fracción de segundo para capturar una imagen y luego cerrarla? Con tal patrón de uso, tendrías que ser increíblemente afortunado para atraparlo en el acto.
un CVn
@ MichaelKjörling por eso mencioné "cuando lsmodcorrió". Merece la expansión dado el escenario que ofrece (aunque en mi experiencia, las latencias de las cámaras son lo suficientemente altas como para que abrir el dispositivo, capturar una imagen y cerrar el dispositivo lleve bastante tiempo). Sin embargo, mirar el uso del dispositivo usando fusero lsofsufre el mismo problema; un enfoque más robusto requeriría conectar las API de V4L usando puntos de rastreo o algo similar.
Stephen Kitt
@ MichaelKjörling De hecho. Para capturar este patrón de uso, tendría que monitorear los accesos a los archivos del dispositivo, no solo verificar en un momento dado.
Gilles 'SO- deja de ser malvado'
7
Suponiendo que lo que realmente desea es asegurarse de que su cámara web no se esté utilizando cuando no lo desee , la solución más simple es simplemente desconectarla (si es externa) cuando no la necesite. O cubriendo la cámara web (solo un trozo de cinta adhesiva funcionaría).
Los enfoques basados en la física son mucho más seguros que los de software.
La cinta no bloquea el micrófono, que puede (incluso en una cámara web incorporada) estructurarse como parte de la cámara en lugar de a través de un módulo de sonido.
Chris H
Aconsejaría fuertemente contra la cinta adhesiva, ya que podría dejar fácilmente un residuo. He usado cinta quirúrgica (disponible en farmacias) porque deja muy pocos residuos cuando se quita, con una pequeña etiqueta que cubre la lente, del lado adhesivo al lado adhesivo. De esa manera no hay riesgo de residuos de pegamento en la lente. Es, sin duda, una solución que está ligeramente en el lado permanente; no quieres despegar y volver a grabar todo el tiempo.
un CVn
@ChrisH eso no tiene ningún sentido (irónicamente, tu mejor SE es inglés ...) ¿Qué quieres decir?
theonlygusti
@theonlygusti Quise decir módulo como en una pieza de hardware; Por supuesto, en este hilo sería más lógico leerlo como software que significa, lo que no tendría mucho sentido. La cinta no bloquea el micrófono. Un micrófono puede ser parte del hardware de la cámara web, en lugar de o además de cualquier cosa conectada a través de la tarjeta de sonido (un término que estaba evitando debido al hardware SoC). Entonces, para determinar si la cámara web está habilitada / activa / espiando, es posible que le preocupe más que solo la lente. Pero el único sistema de Linux que tengo aquí es un Chromebook (crouton), por lo que es un poco limitado.
Chris H
1
Claro, pero esa no era la pregunta
Gilles 'SO- deja de ser malvado'
7
En cualquier sistema cuerdo, a menos que haya configurado chroots con los suyos /dev, todos los archivos del dispositivo están bajo /dev. Solo root puede crear archivos de dispositivo, por lo que no debe preocuparse por los usuarios malintencionados que crean archivos de dispositivo en otro lugar.
Entonces, todo lo que necesita hacer es ubicar los archivos /devque se refieren al mismo dispositivo en el que está interesado.
Es probable que esto solo se muestre /dev/video0. Por lo general, hay un solo archivo de dispositivo para cada dispositivo, y posiblemente haya enlaces simbólicos adicionales.
Por lo tanto, la respuesta práctica a su pregunta es simple. Simplemente verifique qué procesos tienen abierto el archivo del dispositivo.
fuser /dev/video0
Si desea monitorear los accesos (es decir, detectar procesos que pueden abrir el archivo del dispositivo en cualquier momento), use uno de los métodos de monitoreo de acceso a archivos de Linux en los archivos del dispositivo: configure un reloj (y verifique qué procesos ya tienen el dispositivo archivo (s) abierto)
inotifywait -m -e open,close /dev/video0 &
sleep 1; fuser /dev/video0 # check for processes that have already opened the device
o configurar una regla de auditoría que registrará los accesos en los registros del sistema (normalmente /var/log/audit/audit.log)
auditctl -w path=/dev/video0 &
sleep 1; fuser /dev/video0 # check for processes that have already opened the device
¡Buen punto! Pero todavía sufre el problema de un punto en el tiempo de la solución de Angel! (Cf. comentarios allí). La solución de software más sólida es probablemente poner en la lista negra ese dispositivo udevpara que no obtenga un archivo de dispositivo en el arranque; y luego agregue un archivo de dispositivo si planea usar la cámara ... o desenchúfela físicamente.
jpaugh
@jpaugh La pregunta era encontrar procesos usando la cámara web, no deshabilitar la cámara web.
Gilles 'SO- deja de ser malvado'
Debe ser monitoreado a nivel de Kernel. Se puede agregar un dispositivo en cualquier lugar: por ejemplomknod /root/video0 b 81 0
user123456
@ j658063.mvrht.com Pero solo la raíz puede hacer eso. Si root no hace tonterías, entonces estás a salvo. Si root hace cosas estúpidas, entonces estás jodido de todos modos: root también puede cambiar el kernel para ocultar algunos procesos.
lsof
(yfuser
) por defecto no hace lo que necesita.lsof /dev/video0
le gustaría que todos los procesos que contenían un descriptor de archivo abierto estuvieran conectados al objeto vfs del kernel al que se/dev/video0
refiere, sin importar a qué ruta del sistema de archivos se haya utilizado para abrirlo, pero la pregunta del OP deja en claro que esto no es cierto.Respuestas:
Si su kernel usa módulos (lo cual es muy probable), una forma de determinar si un programa está accediendo a su cámara web es mirar el recuento de uso del módulo:
El 0 en el tercer campo muestra que nada tiene ningún dispositivo abierto para una
uvcvideo
cámara web controlada (cuando selsmod
ejecuta). Por supuesto, necesita saber exactamente qué módulo es responsable de su cámara web; Sin embargo, es fácil de verificar, verá el cambio de salida mientras ejecuta un programa como Cheese.Tenga en cuenta que, estrictamente hablando, un conteo positivo solo significa que algo ha abierto un dispositivo, no significa que se estén capturando imágenes.
fuente
lsmod
corrió". Merece la expansión dado el escenario que ofrece (aunque en mi experiencia, las latencias de las cámaras son lo suficientemente altas como para que abrir el dispositivo, capturar una imagen y cerrar el dispositivo lleve bastante tiempo). Sin embargo, mirar el uso del dispositivo usandofuser
olsof
sufre el mismo problema; un enfoque más robusto requeriría conectar las API de V4L usando puntos de rastreo o algo similar.Suponiendo que lo que realmente desea es asegurarse de que su cámara web no se esté utilizando cuando no lo desee , la solución más simple es simplemente desconectarla (si es externa) cuando no la necesite. O cubriendo la cámara web (solo un trozo de cinta adhesiva funcionaría).
Los enfoques basados en la física son mucho más seguros que los de software.
fuente
En cualquier sistema cuerdo, a menos que haya configurado chroots con los suyos
/dev
, todos los archivos del dispositivo están bajo/dev
. Solo root puede crear archivos de dispositivo, por lo que no debe preocuparse por los usuarios malintencionados que crean archivos de dispositivo en otro lugar.Entonces, todo lo que necesita hacer es ubicar los archivos
/dev
que se refieren al mismo dispositivo en el que está interesado.Es probable que esto solo se muestre
/dev/video0
. Por lo general, hay un solo archivo de dispositivo para cada dispositivo, y posiblemente haya enlaces simbólicos adicionales.Por lo tanto, la respuesta práctica a su pregunta es simple. Simplemente verifique qué procesos tienen abierto el archivo del dispositivo.
Si desea monitorear los accesos (es decir, detectar procesos que pueden abrir el archivo del dispositivo en cualquier momento), use uno de los métodos de monitoreo de acceso a archivos de Linux en los archivos del dispositivo: configure un reloj (y verifique qué procesos ya tienen el dispositivo archivo (s) abierto)
o configurar una regla de auditoría que registrará los accesos en los registros del sistema (normalmente
/var/log/audit/audit.log
)fuente
udev
para que no obtenga un archivo de dispositivo en el arranque; y luego agregue un archivo de dispositivo si planea usar la cámara ... o desenchúfela físicamente.mknod /root/video0 b 81 0