Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
gha-lab-e8902eccd3 — Laboratorio de investigación de seguridad: reproducción de CVE-2025-52467 (ejecución de código en el flujo de trabajo pull_request_target de pgai / exfiltración de GITHUB_TOKEN) — instantánea de timescale/pgai | Kitploit
Herramientas/GitHubGitHub/pvharmo2/gha-lab-e8902eccd3
Análisis de VulnerabilidadesExplotaciónAprendizaje y EducaciónRecursos Curados
GitHubpvharmo2/gha-lab-e8902eccd3

gha-lab-e8902eccd3

Laboratorio de investigación de seguridad: reproducción de CVE-2025-52467 (ejecución de código en el flujo de trabajo pull_request_target de pgai / exfiltración de GITHUB_TOKEN) — instantánea de timescale/pgai

Ver Repositorio
1hace 17h 59mAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Artefacto de investigación automatizado — no es el proyecto original.

Este repositorio es un laboratorio desechable construido por un sistema automatizado para una tesis de maestría en la Université Laval sobre la reproducción de vulnerabilidades publicadas en flujos de trabajo de GitHub Actions. Es una instantánea verbatim de timescale/pgai en el commit 2a209b058c60823b57e8b7775b10244ff340eb8b (2025-05-14), redistribuida bajo la licencia de ese proyecto, cuyo archivo se incluye sin cambios en esta instantánea.

El proyecto original no está involucrado, nunca es el objetivo, y la vulnerabilidad estudiada aquí ya es pública. Cada secreto y variable en este repositorio es un valor ficticio generado aleatoriamente — no hay ninguna credencial real presente. Las referencias a acciones e imágenes de ejecutores están fijadas a lo que resolvieron el 2025-05-14; consulta pinning.md en la salida del sistema para cada cambio realizado en la instantánea.

Preguntas u objeciones: [email protected]


pgai pgai

Potencia tus aplicaciones RAG y Agentic con PostgreSQL

Salida de ejemplo:
Docs · ¡Únete al Discord de pgai! · ¡Prueba timescale gratis! · Changelog

Una biblioteca de Python que transforma PostgreSQL en un motor de recuperación robusto y listo para producción para aplicaciones RAG y Agentic.

  • 🔄 Crea y sincroniza automáticamente embeddings vectoriales a partir de datos de PostgreSQL y documentos de S3. Los embeddings se actualizan automáticamente a medida que cambian los datos.

  • 🔍 Potente búsqueda vectorial y semántica con pgvector y pgvectorscale.

  • 🛡️ Listo para producción desde el primer momento: admite procesamiento por lotes para una generación eficiente de embeddings, con manejo integrado de fallos de modelos, límites de tasa y picos de latencia.

  • 🐘 Funciona con cualquier base de datos PostgreSQL, incluidos Timescale Cloud, Amazon RDS, Supabase y más.

Arquitectura básica: El sistema consta de una aplicación que tú escribes, una base de datos PostgreSQL y workers vectorizadores sin estado. La aplicación define una configuración de vectorizador para incrustar datos de fuentes como PostgreSQL o S3. Los workers leen esta configuración, procesan la cola de datos en embeddings y texto fragmentado, y escriben los resultados de vuelta. La aplicación luego consulta estos datos para impulsar RAG y la búsqueda semántica.

La fortaleza clave de esta arquitectura reside en su resiliencia: las modificaciones de datos realizadas por la aplicación están desacopladas del proceso de embedding, lo que garantiza que los fallos en el servicio de embedding no afecten las operaciones de datos principales.

Arquitectura de Pgai: aplicación, base de datos, worker vectorizador

instalación

Primero, instala el paquete pgai.``` pip install pgai

root@kitploit:~
Luego, instala los componentes de la base de datos pgai. Puedes hacerlo desde la terminal usando la CLI o en el código de tu aplicación Python usando el paquete de Python pgai.```
# from the cli
pgai install -d <database-url>

# or from the python package, often done as part of your application setup
import pgai
pgai.install(DB_URL)

Inicio Rápido

Esta guía de inicio rápido demuestra cómo pgai Vectorizer permite la búsqueda semántica y RAG sobre datos de PostgreSQL al crear y sincronizar automáticamente los embeddings a medida que los datos cambian.

El "ingrediente secreto" clave de pgai Vectorizer es su enfoque declarativo para la generación de embeddings. Simplemente define tu pipeline y deja que Vectorizer maneje la complejidad operativa de mantener los embeddings sincronizados, incluso cuando los endpoints de embeddings no son confiables. Puedes definir una versión simple del pipeline de la siguiente manera:```sql CREATE TABLE IF NOT EXISTS wiki ( id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY, url TEXT NOT NULL, title TEXT NOT NULL, text TEXT NOT NULL )

SELECT ai.create_vectorizer( 'wiki'::regclass, loading => ai.loading_column(column_name=>'text'), destination => ai.destination_table(target_table=>'wiki_embedding_storage'), embedding => ai.embedding_openai(model=>'text-embedding-ada-002', dimensions=>'1536') )

root@kitploit:~
El vectorizador creará automáticamente embeddings para todas las filas de la
tabla `wiki` y, lo que es más importante, mantendrá los embeddings sincronizados con los
datos subyacentes a medida que estos cambien.  **Piénsalo casi como declarar un índice** en
la tabla `wiki`, pero en lugar de que la base de datos gestione la estructura de datos del índice
por ti, el Vectorizador gestiona los embeddings.

## Ejecutar el inicio rápido

**Requisitos previos:**
- Una base de datos PostgreSQL ([instrucciones de Docker](https://docs.timescale.com/self-hosted/latest/install/installation-docker/)).
- Una clave de API de OpenAI (usamos OpenAI para los embeddings en el inicio rápido, pero puedes usar [múltiples proveedores](#modelos-de-embedding-compatibles)).

Crea un archivo `.env` con lo siguiente:```
OPENAI_API_KEY=<your-openai-api-key>
DB_URL=<your-database-url>

Puedes descargar el código Python completo y el requirements.txt del ejemplo de inicio rápido y ejecutarlo en el mismo directorio que el archivo .env.

Haz clic aquí para ver un script bash que ejecuta el inicio rápido```bash curl -O https://raw.githubusercontent.com/timescale/pgai/main/examples/quickstart/main.py curl -O https://raw.githubusercontent.com/timescale/pgai/main/examples/quickstart/requirements.txt python -m venv venv source venv/bin/activate pip install -r requirements.txt python main.py ```
Haz clic para expandir la salida de ejemplo``` Search results 1: [WikiSearchResult(id=7, url='https://en.wikipedia.org/wiki/Aristotle', title='Aristotle', text='Aristotle (; Aristotélēs, ; 384–322\xa0BC) was an ' 'Ancient Greek philosopher and polymath. His writings ' 'cover a broad range of subjects spanning the natural ' 'sciences, philosophy, linguistics, economics, ' 'politics, psychology and the arts. As the founder of ' 'the Peripatetic school of philosophy in the Lyceum in ' 'Athens, he began the wider Aristotelian tradition that ' 'followed, which set the groundwork for the development ' 'of modern science.\n' '\n' "Little is known about Aristotle's life. He was born in " 'the city of Stagira in northern Greece during the ' 'Classical period. His father, Nicomachus, died when ' 'Aristotle was a child, and he was brought up by a ' "guardian. At 17 or 18 he joined Plato's Academy in " 'Athens and remained there till the age of 37 (). ' 'Shortly after Plato died, Aristotle left Athens and, ' 'at the request of Philip II of Macedon, tutored his ' 'son Alexander the Great beginning in 343 BC. He ' 'established a library in the Lyceum which helped him ' 'to produce many of his hundreds of books on papyru', chunk='Aristotle (; Aristotélēs, ; 384–322\xa0BC) was an ' 'Ancient Greek philosopher and polymath. His writings ' 'cover a broad range of subjects spanning the natural ' 'sciences, philosophy, linguistics, economics, ' 'politics, psychology and the arts. As the founder of ' 'the Peripatetic school of philosophy in the Lyceum in ' 'Athens, he began the wider Aristotelian tradition ' 'that followed, which set the groundwork for the ' 'development of modern science.', distance=0.22242502364217387)] Search results 2: [WikiSearchResult(id=41, url='https://en.wikipedia.org/wiki/pgai', title='pgai', text='pgai is a Python library that turns PostgreSQL into ' 'the retrieval engine behind robust, production-ready ' 'RAG and Agentic applications. It does this by ' 'automatically creating vector embeddings for your data ' 'based on the vectorizer you define.', chunk='pgai is a Python library that turns PostgreSQL into ' 'the retrieval engine behind robust, production-ready ' 'RAG and Agentic applications. It does this by ' 'automatically creating vector embeddings for your ' 'data based on the vectorizer you define.', distance=0.13639101792546204)] RAG response: The main thing pgai does right now is generating vector embeddings for data in PostgreSQL databases based on the vectorizer defined by the user, enabling the creation of robust RAG and Agentic applications. ```

Recorrido por el código

Instalar los componentes de la base de datos de pgai

Pgai requiere que se instalen algunas tablas de catálogo y funciones en la base de datos. Esto se realiza mediante la función pgai.install, que instalará los componentes necesarios en el esquema ai de la base de datos.```python pgai.install(DB_URL)

root@kitploit:~
### Crear el vectorizador

Esto define el vectorizador, que le indica al sistema cómo crear los embeddings a partir de la columna `text` de la tabla `wiki`. El vectorizador crea una vista `wiki_embedding` que podemos consultar para obtener los embeddings (como veremos a continuación).```python
async def create_vectorizer(conn: psycopg.AsyncConnection):
    async with conn.cursor() as cur:    
        await cur.execute("""
            SELECT ai.create_vectorizer(
                'wiki'::regclass,
                if_not_exists => true,
                loading => ai.loading_column(column_name=>'text'),
                embedding => ai.embedding_openai(model=>'text-embedding-ada-002', dimensions=>'1536'),
                destination => ai.destination_table(view_name=>'wiki_embedding')
            )
        """)   
    await conn.commit()

Ejecutar el worker del vectorizador

En este ejemplo, ejecutamos el worker del vectorizador una vez para crear los embeddings de los datos existentes.```python worker = Worker(DB_URL, once=True) worker.run()

root@kitploit:~
En una aplicación real, no llamaríamos al worker manualmente de esta manera cada vez que queramos crear los embeddings. En su lugar, ejecutaríamos el worker en segundo plano y este se ejecutaría de forma continua, consultando trabajo del vectorizer.

Puedes ejecutar el worker en segundo plano desde la aplicación, la CLI o Docker. Consulta la documentación del [vectorizer worker](https://github.com/pvharmo2/gha-lab-e8902eccd3/blob/main/docs/vectorizer/worker.md) para más detalles.


### Buscar los artículos del wiki mediante búsqueda semántica

Esta es una búsqueda semántica estándar de pgvector en PostgreSQL. La búsqueda se realiza contra la vista `wiki_embedding`, que es creada por el vectorizer e incluye todas las columnas de la tabla `wiki` más la columna `embedding` y el texto de los fragmentos. Esta función devuelve tanto la columna `text` completa de la tabla `wiki` como fragmentos más pequeños del texto que son más relevantes para la consulta.```python
@dataclass
class WikiSearchResult:
    id: int
    url: str
    title: str
    text: str
    chunk: str
    distance: float

async def _find_relevant_chunks(client: AsyncOpenAI, query: str, limit: int = 1) -> List[WikiSearchResult]:
    # Generate embedding for the query using OpenAI's API
    response = await client.embeddings.create(
        model="text-embedding-ada-002",
        input=query,
        encoding_format="float",
    )
    
    embedding = np.array(response.data[0].embedding)
    
    # Query the database for the most similar chunks using pgvector's cosine distance operator (<=>)
    async with pool.connection() as conn:
        async with conn.cursor(row_factory=class_row(WikiSearchResult)) as cur:
            await cur.execute("""
                SELECT w.id, w.url, w.title, w.text, w.chunk, w.embedding <=> %s as distance
                FROM wiki_embedding w
                ORDER BY distance
                LIMIT %s
            """, (embedding, limit))
            
            return await cur.fetchall()

Insertar un nuevo artículo en la tabla wiki

Este código destaca por lo que no está haciendo. Se trata de una inserción simple de un nuevo artículo en la tabla wiki. No necesitamos hacer nada diferente para crear los embeddings, ya que el worker vectorizador se encargará de actualizar los embeddings a medida que los datos cambien.```python def insert_article_about_pgai(conn: psycopg.AsyncConnection): async with conn.cursor(row_factory=class_row(WikiSearchResult)) as cur: await cur.execute(""" INSERT INTO wiki (url, title, text) VALUES ('https://en.wikipedia.org/wiki/pgai', 'pgai', 'pgai is a Python library that turns PostgreSQL into the retrieval engine behind robust, production-ready RAG and Agentic applications. It does this by automatically creating vector embeddings for your data based on the vectorizer you define.') """) await conn.commit()

root@kitploit:~
### Realizar RAG con el LLM

Este código realiza RAG con el LLM. Utiliza la función `_find_relevant_chunks` definida anteriormente para encontrar los fragmentos de texto más relevantes de la tabla `wiki` y luego utiliza el LLM para generar una respuesta.```python
    query = "What is the main thing pgai does right now?"
    relevant_chunks = await _find_relevant_chunks(client, query)
    context = "\n\n".join(
        f"{chunk.title}:\n{chunk.text}" 
        for chunk in relevant_chunks
    )
    prompt = f"""Question: {query}

Please use the following context to provide an accurate response:   

{context}

Answer:"""

    response = await client.chat.completions.create({
        model: "gpt-3.5-turbo",
        messages: [{ role: "user", content: prompt }],
    })
    print("RAG response:")
    print(response.choices[0].message.content)

Próximos pasos

Busca otras guías de inicio rápido:

  • Guía de inicio rápido con FastAPI y psycopg aquí

Explora más sobre el vectorizer:

  • Aprende más sobre el vectorizer y el vectorizer worker
  • Profundiza en la referencia de la API del vectorizer

Características

Nuestra biblioteca de Python pgai te permite trabajar con embeddings generados a partir de tus datos:

  • Crea y sincroniza automáticamente embeddings vectoriales para tus datos usando el vectorizer.
  • Carga datos desde una columna de tu tabla o desde un archivo, bucket de s3, etc.
  • Crea múltiples embeddings para los mismos datos con diferentes modelos y parámetros para pruebas y experimentación.
  • Personaliza cómo tu pipeline de embeddings analiza, divide en fragmentos, formatea y genera embeddings de tus datos.

Puedes usar los embeddings vectoriales para:

  • Realizar búsqueda semántica usando pgvector.
  • Implementar Generación Aumentada por Recuperación (RAG)
  • Realizar búsqueda ANN de alto rendimiento y rentable en cargas de trabajo vectoriales grandes con pgvectorscale, que complementa a pgvector.

También ofrecemos una extensión de PostgreSQL que puede realizar llamadas a modelos LLM directamente desde SQL. Esto suele ser útil para casos de uso como clasificación, resumen y enriquecimiento de datos en tus datos existentes.

Un pipeline de vectorizer configurable

El vectorizer está diseñado para ser flexible y personalizable. Cada vectorizer define un pipeline para crear embeddings a partir de tus datos. El pipeline se define mediante una serie de componentes que se aplican en secuencia a los datos:

  • Carga: Primero, defines la fuente de los datos a embeber. Pueden ser los datos almacenados directamente en una columna de la tabla fuente o una URI referenciada en una columna de la tabla fuente que apunte a un archivo, bucket de s3, etc.
  • Análisis: Luego, defines la forma en que se analizan los datos si son un documento no textual como un archivo PDF, HTML o markdown.
  • División en fragmentos: A continuación, defines la forma en que los datos de texto se dividen en fragmentos.
  • Formato: Después, para cada fragmento, defines la forma en que los datos se formatean antes de enviarse para la generación de embeddings. Por ejemplo, puedes añadir el título del documento como primera línea del fragmento.
  • Embedding: Finalmente, especificas el proveedor de LLM, el modelo y los parámetros que se usarán al generar los embeddings.

Modelos de embedding compatibles

Los siguientes modelos son compatibles para la generación de embeddings:

  • Ollama
  • OpenAI
  • Voyage AI
  • Cohere
  • Huggingface
  • Mistral
  • Azure OpenAI
  • AWS Bedrock
  • Vertex AI

El diablo está en el manejo de errores

Simplemente crear embeddings vectoriales es fácil y sencillo. El desafío es que los LLM son algo poco fiables y los endpoints presentan fallos intermitentes y/o rendimiento degradado. Una parte crítica para manejar correctamente los fallos es que tus operaciones primarias de modificación de datos (INSERT, UPDATE, DELETE) no deben depender de la operación de embedding. De lo contrario, tu aplicación estará caída cada vez que el endpoint sea lento o falle y la experiencia de tus usuarios se verá afectada.

Normalmente, necesitarías implementar un pipeline de MLops personalizado para manejar correctamente los fallos de los endpoints. Esto comúnmente implica un sistema de colas como Kafka, workers especializados y otra infraestructura para manejar la cola y reintentar las solicitudes fallidas. Esto es mucho trabajo y es fácil equivocarse.

Con pgai, puedes omitir todo eso y centrarte en construir tu aplicación porque el vectorizer gestiona los embeddings por ti. Hemos incorporado lógica de colas y reintentos para manejar los distintos modos de fallo que puedes encontrar. Como hacemos este trabajo en segundo plano, las operaciones primarias de modificación de datos no dependen de la operación de embedding. Por eso pgai está listo para producción desde el primer momento.

Muchas bases de datos vectoriales especializadas crean embeddings por ti. Sin embargo, normalmente fallan cuando los endpoints de embedding están caídos o degradados, colocando la carga del manejo de errores y los reintentos de nuevo sobre ti.

Recursos

Por qué lo construimos

  • Las bases de datos vectoriales son la abstracción incorrecta
  • pgai: Dando a los desarrolladores de PostgreSQL superpoderes de ingeniería de IA

Guías de inicio rápido

  • La guía de inicio rápido con Ollama de arriba
  • Inicio rápido con OpenAI
  • Inicio rápido con VoyageAI

Tutoriales sobre el vectorizer de pgai

  • Cómo crear y actualizar automáticamente embeddings en PostgreSQL—Con una sola consulta SQL
  • [video] Crea y sincroniza automáticamente embeddings vectoriales en 1 línea de SQL
  • ¿Qué modelo de embedding de OpenAI es mejor para tu aplicación RAG con Pgvector?
  • ¿Qué estrategia de división en fragmentos y formato RAG es mejor para tu aplicación con Pgvector
  • Analizando todos los datos con herramientas de código abierto: Unstructured y Pgai

Contribuciones

¡Damos la bienvenida a contribuciones a pgai! Consulta la página de Contribuciones para más información.

Participa

pgai aún está en una etapa temprana. Ahora es un gran momento para ayudar a dar forma a la dirección de este proyecto; actualmente estamos decidiendo prioridades. Echa un vistazo a la lista de características en las que estamos pensando trabajar. Siéntete libre de comentar, ampliar la lista o unirte al foro de Discusiones.

Para comenzar, echa un vistazo a cómo contribuir y cómo configurar un entorno de desarrollo/pruebas.

Acerca de Timescale

Timescale es una empresa de bases de datos PostgreSQL. Para aprender más, visita timescale.com.

Timescale Cloud es una plataforma en la nube de alto rendimiento, centrada en el desarrollador, que proporciona servicios de PostgreSQL para las cargas de trabajo más exigentes de IA, series temporales, análisis y eventos. Timescale Cloud es ideal para aplicaciones de producción y proporciona alta disponibilidad, copias de seguridad en streaming, actualizaciones a lo largo del tiempo, roles y permisos, y una gran seguridad.

Descargar herramienta